From 8f3fdb377c3696abfd4be7189fdc0a273df010b2 Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Fri, 22 Jul 2022 19:15:47 +0500 Subject: [PATCH 01/16] =?UTF-8?q?=D0=9D=D0=BE=D0=B2=D0=B0=D1=8F=20=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D1=81=D0=B8=D1=8F=20=D0=B1=D1=83=D0=B4=D0=B5=D1=82?= =?UTF-8?q?=20=D0=BA=D0=B0=D0=BA=204.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 4 +-- package.json | 5 ++-- scripts/migrate-db-from-v4.6-to-v4.7.js | 38 ------------------------- 3 files changed, 4 insertions(+), 43 deletions(-) delete mode 100644 scripts/migrate-db-from-v4.6-to-v4.7.js diff --git a/package-lock.json b/package-lock.json index 18f20666..1b868c9b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jaba", - "version": "3.4.7", + "version": "4.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jaba", - "version": "3.4.7", + "version": "4.0", "license": "ISC", "dependencies": { "@discordjs/opus": "^0.7.0", diff --git a/package.json b/package.json index c9c033dd..485716a4 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,13 @@ { "name": "jaba", - "version": "3.4.7", + "version": "4.0", "description": "A very complete Discord bot (more than 100 commands) that uses the Discord.js", "main": "index.js", "private": true, "scripts": { "start": "node .", "lint": "eslint . --ext .js", - "testcfg": "node scripts/verify-config.js", - "migratedb": "node scripts/migrate-db-from-v4.6-to-v4.7.js" + "testcfg": "node scripts/verify-config.js" }, "author": "Jonny_Bro", "license": "ISC", diff --git a/scripts/migrate-db-from-v4.6-to-v4.7.js b/scripts/migrate-db-from-v4.6-to-v4.7.js deleted file mode 100644 index dcec93fa..00000000 --- a/scripts/migrate-db-from-v4.6-to-v4.7.js +++ /dev/null @@ -1,38 +0,0 @@ -const chalk = require("chalk"); -console.log(chalk.blue("Migrating database from v4.6.4 to v4.7.0...\n\n")); - -let MongoClient; - -try { - MongoClient = require("mongodb").MongoClient; -} catch (e) { - console.log(chalk.red("Cannot find module mongodb. Please install it using \"npm install mongodb\" before executing script.")); - process.exit(1); -} - -const config = require("../config"); -const dbName = config.mongoDB.split("/").pop(); -const baseURL = config.mongoDB.substr(0, config.mongoDB.length - dbName.length); -const client = new MongoClient(baseURL, { - useUnifiedTopology: true -}); - -client.connect().then(async () => { - console.log(chalk.green("Connected successfully to mongoDB database.")); - - const db = client.db(dbName); - const guilds = db.collection("guilds"); - - const count = await guilds.countDocuments({ $or: [{ language: "english" }, { language: "russian" }] }); - console.log(chalk.yellow(`${count} guilds need to be migrated. Migrating...`)); - - await guilds.updateMany({ language: "english" }, { $set: { language: "en-US" } }); - await guilds.updateMany({ language: "russian" }, { $set: { language: "ru-RU" } }); - - console.log(chalk.green(`${count} guilds migrated.`)); - console.log(chalk.blue("\n\nDatabase migrated from v4.6.4 to v4.7.0...")); - process.exit(0); -}).catch(() => { - console.log(chalk.red("Couldn't connect to mongoDB database...")); - process.exit(1); -}); \ No newline at end of file From 5a1e5b64c5c3a0d9160ec59cef4e61f2d1623e6c Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Sat, 23 Jul 2022 17:14:42 +0500 Subject: [PATCH 02/16] =?UTF-8?q?=D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=20?= =?UTF-8?q?=D0=B3=D0=BE=D1=82=D0=BE=D0=B2=D0=B0,=20=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D1=82=D1=8C=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4=D1=8B=20=D0=BF=D0=BE=D0=B4=20=D0=B8=D0=BD=D1=82=D0=B5?= =?UTF-8?q?=D1=80=D0=B0=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/BaseCommand.js | 18 + base/BaseEvent.js | 14 + base/Command.js | 23 - base/Guild.js | 10 - base/JaBa.js | 179 ++++-- base/Log.js | 15 - base/User.js | 7 - commands/Administration/addcommand.js | 41 -- commands/Administration/addemoji.js | 38 -- commands/Administration/automod.js | 55 -- commands/Administration/autorole.js | 60 -- commands/Administration/backup.js | 145 ----- commands/Administration/configuration.js | 98 --- commands/Administration/delcommand.js | 33 - commands/Administration/deletemod.js | 35 -- commands/Administration/goodbye.js | 108 ---- commands/Administration/ignore.js | 41 -- commands/Administration/set.js | 57 -- commands/Administration/setbirthdays.js | 45 -- commands/Administration/setlang.js | 33 - commands/Administration/setmodlogs.js | 45 -- commands/Administration/setprefix.js | 33 - commands/Administration/setreports.js | 45 -- commands/Administration/setsuggests.js | 45 -- commands/Administration/slowmode.js | 54 -- commands/Administration/stealemoji.js | 39 -- commands/Administration/welcome.js | 111 ---- commands/Economy/achievements.js | 80 --- commands/Economy/birthdate.js | 50 -- commands/Economy/deposit.js | 52 -- commands/Economy/divorce.js | 45 -- commands/Economy/findwords.js | 157 ----- commands/Economy/horserace.js | 184 ------ commands/Economy/leaderboard.js | 174 ------ commands/Economy/marry.js | 134 ---- commands/Economy/money.js | 75 --- commands/Economy/number.js | 98 --- commands/Economy/pay.js | 59 -- commands/Economy/profile.js | 98 --- commands/Economy/rep.js | 71 --- commands/Economy/rob.js | 78 --- commands/Economy/setbio.js | 30 - commands/Economy/slots.js | 208 ------ commands/Economy/tictactoe.js | 46 -- commands/Economy/transactions.js | 56 -- commands/Economy/withdraw.js | 52 -- commands/Economy/work.js | 114 ---- commands/Fun/8ball.js | 31 - commands/Fun/ascii.js | 34 - commands/Fun/choice.js | 36 -- commands/Fun/flip.js | 25 - commands/Fun/lmg.js | 30 - commands/Fun/lovecalc.js | 59 -- commands/Fun/memes.js | 78 --- commands/General/activity.js | 263 -------- commands/General/emoji.js | 46 -- commands/General/help.js | 117 ---- commands/General/invite.js | 57 -- commands/General/invites.js | 72 --- commands/General/minecraft.js | 85 --- commands/General/permissions.js | 50 -- commands/General/ping.js | 30 - commands/General/quote.js | 88 --- commands/General/remindme.js | 45 -- commands/General/report.js | 69 -- commands/General/serverinfo.js | 71 --- commands/General/setafk.js | 49 -- commands/General/shorturl.js | 42 -- commands/General/staff.js | 42 -- commands/General/stats.js | 63 -- commands/General/suggest.js | 64 -- commands/General/translate.js | 72 --- commands/General/userinfo.js | 114 ---- commands/General/whois.js | 73 --- commands/Images/approved.js | 41 -- commands/Images/avatar.js | 37 -- commands/Images/batslap.js | 48 -- commands/Images/beautiful.js | 41 -- commands/Images/bed.js | 52 -- commands/Images/brazzers.js | 41 -- commands/Images/burn.js | 41 -- commands/Images/captcha.js | 45 -- commands/Images/challenger.js | 41 -- commands/Images/clyde.js | 47 -- commands/Images/crush.js | 41 -- commands/Images/dictator.js | 41 -- commands/Images/facepalm.js | 55 -- commands/Images/fire.js | 41 -- commands/Images/jail.js | 41 -- commands/Images/love.js | 48 -- commands/Images/magik.js | 41 -- commands/Images/mission.js | 41 -- commands/Images/phcomment.js | 58 -- commands/Images/ps4.js | 41 -- commands/Images/qrcode.js | 39 -- commands/Images/rip.js | 41 -- commands/Images/scary.js | 41 -- commands/Images/steamcard.js | 45 -- commands/Images/tobecontinued.js | 41 -- commands/Images/trash.js | 40 -- commands/Images/triggered.js | 41 -- commands/Images/wanted.js | 41 -- commands/Images/wasted.js | 41 -- commands/Images/youtube-comment.js | 50 -- commands/Mention.js | 35 ++ commands/Moderation/announcement.js | 99 --- commands/Moderation/ban.js | 112 ---- commands/Moderation/clear.js | 80 --- commands/Moderation/clearwarns.js | 35 -- commands/Moderation/giveaway.js | 127 ---- commands/Moderation/kick.js | 100 --- commands/Moderation/mute.js | 113 ---- commands/Moderation/poll.js | 109 ---- commands/Moderation/sanctions.js | 61 -- commands/Moderation/setwarns.js | 68 -- commands/Moderation/unban.js | 60 -- commands/Moderation/unmute.js | 47 -- commands/Moderation/warn.js | 144 ----- commands/Music/autoplay.js | 32 - commands/Music/back.js | 50 -- commands/Music/clip.js | 58 -- commands/Music/clips.js | 46 -- commands/Music/createplaylist.js | 46 -- commands/Music/filter.js | 41 -- commands/Music/filters.js | 48 -- commands/Music/jump.js | 53 -- commands/Music/loop.js | 40 -- commands/Music/lyrics.js | 64 -- commands/Music/np.js | 63 -- commands/Music/pause.js | 32 - commands/Music/play.js | 45 -- commands/Music/playlists.js | 96 --- commands/Music/playplaylist.js | 54 -- commands/Music/queue.js | 66 -- commands/Music/removeplaylist.js | 42 -- commands/Music/resume.js | 32 - commands/Music/seek.js | 35 -- commands/Music/skip.js | 52 -- commands/Music/stop.js | 48 -- commands/NSFW/nsfw.js | 78 --- commands/Owner/debug.js | 100 --- commands/Owner/eval.js | 43 -- commands/Owner/reload.js | 38 -- commands/Owner/say.js | 88 --- commands/Owner/servers-list.js | 124 ---- commands/Ping.js | 34 + commands/Repeat.js | 37 ++ config.sample.js | 12 +- dashboard/utils.js | 3 - events/CommandHandler.js | 58 ++ events/guildCreate.js | 28 +- events/guildDelete.js | 30 +- events/guildMemberAdd.js | 24 +- events/guildMemberRemove.js | 24 +- events/guildMemberUpdate.js | 22 +- events/messageCreate.js | 160 +---- events/messageUpdate.js | 10 - events/ready.js | 35 +- helpers/discordbots.org.js | 41 -- helpers/extenders.js | 23 +- index.js | 71 +-- languages/en-US/administration/slowmode.json | 8 - languages/language-meta.json | 19 +- languages/ru-RU/administration/slowmode.json | 8 - languages/ru-RU/misc.json | 3 +- languages/ru-RU/music/createplaylist.json | 8 - languages/ru-RU/music/playlists.json | 12 - languages/ru-RU/music/playplaylist.json | 5 - languages/ru-RU/music/removeplaylist.json | 8 - languages/uk-UA/administration/slowmode.json | 8 - languages/uk-UA/music/createplaylist.json | 8 - languages/uk-UA/music/playlists.json | 12 - languages/uk-UA/music/playplaylist.json | 5 - languages/uk-UA/music/removeplaylist.json | 8 - package-lock.json | 626 +++++++++++-------- package.json | 8 +- 176 files changed, 839 insertions(+), 9618 deletions(-) create mode 100644 base/BaseCommand.js create mode 100644 base/BaseEvent.js delete mode 100644 base/Command.js delete mode 100644 base/Log.js delete mode 100644 commands/Administration/addcommand.js delete mode 100644 commands/Administration/addemoji.js delete mode 100644 commands/Administration/automod.js delete mode 100644 commands/Administration/autorole.js delete mode 100644 commands/Administration/backup.js delete mode 100644 commands/Administration/configuration.js delete mode 100644 commands/Administration/delcommand.js delete mode 100644 commands/Administration/deletemod.js delete mode 100644 commands/Administration/goodbye.js delete mode 100644 commands/Administration/ignore.js delete mode 100644 commands/Administration/set.js delete mode 100644 commands/Administration/setbirthdays.js delete mode 100644 commands/Administration/setlang.js delete mode 100644 commands/Administration/setmodlogs.js delete mode 100644 commands/Administration/setprefix.js delete mode 100644 commands/Administration/setreports.js delete mode 100644 commands/Administration/setsuggests.js delete mode 100644 commands/Administration/slowmode.js delete mode 100644 commands/Administration/stealemoji.js delete mode 100644 commands/Administration/welcome.js delete mode 100644 commands/Economy/achievements.js delete mode 100644 commands/Economy/birthdate.js delete mode 100644 commands/Economy/deposit.js delete mode 100644 commands/Economy/divorce.js delete mode 100644 commands/Economy/findwords.js delete mode 100644 commands/Economy/horserace.js delete mode 100644 commands/Economy/leaderboard.js delete mode 100644 commands/Economy/marry.js delete mode 100644 commands/Economy/money.js delete mode 100644 commands/Economy/number.js delete mode 100644 commands/Economy/pay.js delete mode 100644 commands/Economy/profile.js delete mode 100644 commands/Economy/rep.js delete mode 100644 commands/Economy/rob.js delete mode 100644 commands/Economy/setbio.js delete mode 100644 commands/Economy/slots.js delete mode 100644 commands/Economy/tictactoe.js delete mode 100644 commands/Economy/transactions.js delete mode 100644 commands/Economy/withdraw.js delete mode 100644 commands/Economy/work.js delete mode 100644 commands/Fun/8ball.js delete mode 100644 commands/Fun/ascii.js delete mode 100644 commands/Fun/choice.js delete mode 100644 commands/Fun/flip.js delete mode 100644 commands/Fun/lmg.js delete mode 100644 commands/Fun/lovecalc.js delete mode 100644 commands/Fun/memes.js delete mode 100644 commands/General/activity.js delete mode 100644 commands/General/emoji.js delete mode 100644 commands/General/help.js delete mode 100644 commands/General/invite.js delete mode 100644 commands/General/invites.js delete mode 100644 commands/General/minecraft.js delete mode 100644 commands/General/permissions.js delete mode 100644 commands/General/ping.js delete mode 100644 commands/General/quote.js delete mode 100644 commands/General/remindme.js delete mode 100644 commands/General/report.js delete mode 100644 commands/General/serverinfo.js delete mode 100644 commands/General/setafk.js delete mode 100644 commands/General/shorturl.js delete mode 100644 commands/General/staff.js delete mode 100644 commands/General/stats.js delete mode 100644 commands/General/suggest.js delete mode 100644 commands/General/translate.js delete mode 100644 commands/General/userinfo.js delete mode 100644 commands/General/whois.js delete mode 100644 commands/Images/approved.js delete mode 100644 commands/Images/avatar.js delete mode 100644 commands/Images/batslap.js delete mode 100644 commands/Images/beautiful.js delete mode 100644 commands/Images/bed.js delete mode 100644 commands/Images/brazzers.js delete mode 100644 commands/Images/burn.js delete mode 100644 commands/Images/captcha.js delete mode 100644 commands/Images/challenger.js delete mode 100644 commands/Images/clyde.js delete mode 100644 commands/Images/crush.js delete mode 100644 commands/Images/dictator.js delete mode 100644 commands/Images/facepalm.js delete mode 100644 commands/Images/fire.js delete mode 100644 commands/Images/jail.js delete mode 100644 commands/Images/love.js delete mode 100644 commands/Images/magik.js delete mode 100644 commands/Images/mission.js delete mode 100644 commands/Images/phcomment.js delete mode 100644 commands/Images/ps4.js delete mode 100644 commands/Images/qrcode.js delete mode 100644 commands/Images/rip.js delete mode 100644 commands/Images/scary.js delete mode 100644 commands/Images/steamcard.js delete mode 100644 commands/Images/tobecontinued.js delete mode 100644 commands/Images/trash.js delete mode 100644 commands/Images/triggered.js delete mode 100644 commands/Images/wanted.js delete mode 100644 commands/Images/wasted.js delete mode 100644 commands/Images/youtube-comment.js create mode 100644 commands/Mention.js delete mode 100644 commands/Moderation/announcement.js delete mode 100644 commands/Moderation/ban.js delete mode 100644 commands/Moderation/clear.js delete mode 100644 commands/Moderation/clearwarns.js delete mode 100644 commands/Moderation/giveaway.js delete mode 100644 commands/Moderation/kick.js delete mode 100644 commands/Moderation/mute.js delete mode 100644 commands/Moderation/poll.js delete mode 100644 commands/Moderation/sanctions.js delete mode 100644 commands/Moderation/setwarns.js delete mode 100644 commands/Moderation/unban.js delete mode 100644 commands/Moderation/unmute.js delete mode 100644 commands/Moderation/warn.js delete mode 100644 commands/Music/autoplay.js delete mode 100644 commands/Music/back.js delete mode 100644 commands/Music/clip.js delete mode 100644 commands/Music/clips.js delete mode 100644 commands/Music/createplaylist.js delete mode 100644 commands/Music/filter.js delete mode 100644 commands/Music/filters.js delete mode 100644 commands/Music/jump.js delete mode 100644 commands/Music/loop.js delete mode 100644 commands/Music/lyrics.js delete mode 100644 commands/Music/np.js delete mode 100644 commands/Music/pause.js delete mode 100644 commands/Music/play.js delete mode 100644 commands/Music/playlists.js delete mode 100644 commands/Music/playplaylist.js delete mode 100644 commands/Music/queue.js delete mode 100644 commands/Music/removeplaylist.js delete mode 100644 commands/Music/resume.js delete mode 100644 commands/Music/seek.js delete mode 100644 commands/Music/skip.js delete mode 100644 commands/Music/stop.js delete mode 100644 commands/NSFW/nsfw.js delete mode 100644 commands/Owner/debug.js delete mode 100644 commands/Owner/eval.js delete mode 100644 commands/Owner/reload.js delete mode 100644 commands/Owner/say.js delete mode 100644 commands/Owner/servers-list.js create mode 100644 commands/Ping.js create mode 100644 commands/Repeat.js create mode 100644 events/CommandHandler.js delete mode 100644 events/messageUpdate.js delete mode 100644 helpers/discordbots.org.js delete mode 100644 languages/en-US/administration/slowmode.json delete mode 100644 languages/ru-RU/administration/slowmode.json delete mode 100644 languages/ru-RU/music/createplaylist.json delete mode 100644 languages/ru-RU/music/playlists.json delete mode 100644 languages/ru-RU/music/playplaylist.json delete mode 100644 languages/ru-RU/music/removeplaylist.json delete mode 100644 languages/uk-UA/administration/slowmode.json delete mode 100644 languages/uk-UA/music/createplaylist.json delete mode 100644 languages/uk-UA/music/playlists.json delete mode 100644 languages/uk-UA/music/playplaylist.json delete mode 100644 languages/uk-UA/music/removeplaylist.json diff --git a/base/BaseCommand.js b/base/BaseCommand.js new file mode 100644 index 00000000..45de8430 --- /dev/null +++ b/base/BaseCommand.js @@ -0,0 +1,18 @@ +class BaseCommand { + constructor(options) { + /** + * @type {import("@discordjs/builders").SlashCommandBuilder | import("discord.js").ApplicationCommandData} + */ + this.command = options.command; + /** + * @type {Array} + */ + this.aliases = options.aliases; + /** + * @type {Boolean} + */ + this.guildOnly = options.guildOnly || true; + } +} + +module.exports = BaseCommand; \ No newline at end of file diff --git a/base/BaseEvent.js b/base/BaseEvent.js new file mode 100644 index 00000000..ae92c541 --- /dev/null +++ b/base/BaseEvent.js @@ -0,0 +1,14 @@ +class BaseEvent { + constructor(options) { + /** + * @type {String} + */ + this.name = options.name; + /** + * @type {Boolean} + */ + this.once = options.once; + } +} + +module.exports = BaseEvent; \ No newline at end of file diff --git a/base/Command.js b/base/Command.js deleted file mode 100644 index fa9e4426..00000000 --- a/base/Command.js +++ /dev/null @@ -1,23 +0,0 @@ -const path = require("path"); - -module.exports = class Command { - constructor(client, { - name = null, - dirname = false, - enabled = true, - guildOnly = false, - aliases = new Array(), - botPermissions = new Array(), - memberPermissions = new Array(), - nsfw = false, - ownerOnly = false, - cooldown = 3000 - }) - - { - const category = (dirname ? dirname.split(path.sep)[parseInt(dirname.split(path.sep).length - 1, 10)] : "Other"); - this.client = client; - this.conf = { enabled, guildOnly, memberPermissions, botPermissions, nsfw, ownerOnly, cooldown}; - this.help = { name, category, aliases }; - } -}; \ No newline at end of file diff --git a/base/Guild.js b/base/Guild.js index 88c4b90f..b335be5d 100644 --- a/base/Guild.js +++ b/base/Guild.js @@ -1,6 +1,5 @@ const mongoose = require("mongoose"), Schema = mongoose.Schema, - config = require("../config"), languages = require("../languages/language-meta.json"); module.exports = mongoose.model("Guild", new Schema({ @@ -13,7 +12,6 @@ module.exports = mongoose.model("Guild", new Schema({ /* CONFIGURATION */ language: { type: String, default: languages.find((l) => l.default).name }, // Language of the guild - prefix: { type: String, default: config.prefix }, // Default or custom prefix of the guild plugins: { type: Object, default: { // Plugins data // Welcome messages welcome: { @@ -55,14 +53,6 @@ module.exports = mongoose.model("Guild", new Schema({ reports: false, // the channel in which the reports will be sent logs: false // the channel in which the logs (message deleted, etc...) will be sent }}, - slowmode: { type: Object, default: { // Servers slowmode - users: [], - channels: [] - }}, casesCount: { type: Number, default: 0 }, - ignoredChannels: { type: Array, default: [] }, // Channels ignored by the bot - customCommands: { type: Array, default: [] }, // Custom commands of the guild - commands: { type: Array, default: [] }, // Commands logs autoDeleteModCommands: { type: Boolean, default: false }, // Whether to auto delete moderation commands - disabledCategories: { type: Array, default: [] } // Disabled categories })); \ No newline at end of file diff --git a/base/JaBa.js b/base/JaBa.js index b297f10a..1b4b349e 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -2,12 +2,18 @@ const { MessageEmbed, Client, Collection } = require("discord.js"), { GiveawaysManager } = require("discord-giveaways"), { SoundCloudPlugin } = require("@distube/soundcloud"), { SpotifyPlugin } = require("@distube/spotify"), - { YtDlpPlugin } = require("@distube/yt-dlp"); + { YtDlpPlugin } = require("@distube/yt-dlp"), + { SlashCommandBuilder } = require("@discordjs/builders"), + { REST } = require("@discordjs/rest"), + { Routes } = require("discord-api-types/v9"); const util = require("util"), + BaseEvent = require("./BaseEvent.js"), + BaseCommand = require("./BaseCommand.js"), AmeClient = require("amethyste-api"), path = require("path"), - fetch = require("node-fetch"), + fs = require("fs").promises, + mongoose = require("mongoose"), DisTube = require("distube"), moment = require("moment"); @@ -26,16 +32,13 @@ class JaBa extends Client { this.customEmojis = require("../emojis"); // load the bot's emojis this.languages = require("../languages/language-meta"); // Load the bot's languages this.commands = new Collection(); // Creates new commands collection - this.aliases = new Collection(); // Creates new command aliases collection this.logger = require("../helpers/logger"); // Load the logger file this.wait = util.promisify(setTimeout); // client.wait(1000) - Wait 1 second this.functions = require("../helpers/functions"); // Load the functions file this.guildsData = require("../base/Guild"); // Guild mongoose model this.usersData = require("../base/User"); // User mongoose model this.membersData = require("../base/Member"); // Member mongoose model - this.logs = require("../base/Log"); // Log mongoose model this.dashboard = require("../dashboard/app"); // Dashboard app - this.queues = new Collection(); // This collection will be used for the music this.states = {}; // Used for the dashboard this.knownGuilds = []; @@ -43,22 +46,11 @@ class JaBa extends Client { this.databaseCache.users = new Collection(); this.databaseCache.guilds = new Collection(); this.databaseCache.members = new Collection(); - this.databaseCache.usersReminds = new Collection(); // members with active reminds this.databaseCache.mutedUsers = new Collection(); // members who are currently muted if (this.config.apiKeys.amethyste) this.AmeAPI = new AmeClient(this.config.apiKeys.amethyste); - this.icanhazdadjoke = async function() { - const joke = await fetch("https://icanhazdadjoke.com/", { - headers: { - "Accept": "application/json" - } - }); - - return joke.json(); - }; - this.player = new DisTube.default(this, { plugins: [ new SpotifyPlugin({ @@ -167,39 +159,140 @@ class JaBa extends Client { return five; } - // This function is used to load a command and add it to the collection - loadCommand(commandPath, commandName) { + /** + * + * @param {String} dir + * @param {String} guild_id + * @returns + */ + async loadCommands(dir, guild_id) { + const filePath = path.join(__dirname, dir); + const files = await fs.readdir(filePath); + const rest = new REST({ version: "9" }).setToken(this.config.token); + const commands = []; + const guild_commands = []; + for (let index = 0; index < files.length; index++) { + const file = files[index]; + const stat = await fs.lstat(path.join(filePath, file)); + if (stat.isDirectory()) this.loadCommands(this, path.join(dir, file)); + if (file.endsWith(".js")) { + const Command = require(path.join(filePath, file)); + if (Command.prototype instanceof BaseCommand) { + const command = new Command(); + this.commands.set(command.command.name, command); + const aliases = []; + if (command.aliases && Array.isArray(command.aliases) && command.aliases.length > 0) { + command.aliases.forEach((alias) => { + const command_alias = command.command instanceof SlashCommandBuilder ? { ...command.command.toJSON() } : { ...command.command }; + command_alias.name = alias; + aliases.push(command_alias); + this.commands.set(alias, command); + }); + } + + if (command.guildOnly) guild_commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + else commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + + if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); + this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`); + } + } + } + try { - const props = new(require(`.${commandPath}${path.sep}${commandName}`))(this); - this.logger.log(`Loading Command: ${props.help.name}. 👌`, "log"); - props.conf.location = commandPath; - if (props.init) props.init(this); - - this.commands.set(props.help.name, props); - props.help.aliases.forEach((alias) => { - this.aliases.set(alias, props.help.name); - }); - - return false; - } catch (e) { - return `Unable to load command ${commandName}: ${e}`; + if (guild_id && guild_id.length) { + await rest.put( + Routes.applicationGuildCommands(this.config.user, guild_id), { + body: guild_commands + }, + ); + } + await rest.put( + Routes.applicationCommands(this.config.user), { + body: commands + }, + ); + this.logger.log("Successfully registered application commands."); + } catch (err) { + this.logger.log("Cannot load commands: " + err.message, "error"); } } - // This function is used to unload a command (you need to load them again) - async unloadCommand(commandPath, commandName) { - let command; - if (this.commands.has(commandName)) command = this.commands.get(commandName); - else if (this.aliases.has(commandName)) command = this.commands.get(this.aliases.get(commandName)); - - if (!command) return `The command \`${commandName}\` doesn't seem to exist, nor is it an alias. Try again!`; - if (command.shutdown) await command.shutdown(this); - - delete require.cache[require.resolve(`.${commandPath}${path.sep}${commandName}.js`)]; - - return false; + /** + * + * @param {String} dir + * @returns + */ + async loadEvents(dir) { + const filePath = path.join(__dirname, dir); + const files = await fs.readdir(filePath); + for (let index = 0; index < files.length; index++) { + const file = files[index]; + const stat = await fs.lstat(path.join(filePath, file)); + if (stat.isDirectory()) this.loadEvents(this, path.join(dir, file)); + if (file.endsWith(".js")) { + const Event = require(path.join(filePath, file)); + if (Event.prototype instanceof BaseEvent) { + const event = new Event(); + if (!event.name || !event.name.length) return console.error(`Cannot load "${file}" event file: Event name is not set!`); + if (event.once) this.once(event.name, event.execute.bind(event, this)); + else this.on(event.name, event.execute.bind(event, this)); + this.logger.log(`Successfully loaded "${file}" event file. (Event: ${event.name})`); + } + } + } } + async init() { + this.login(this.config.token); + + mongoose.connect(this.config.mongoDB, { + useNewUrlParser: true, + useUnifiedTopology: true + }).then(() => { + this.logger.log("Connected to the Mongodb database.", "log"); + }).catch((err) => { + this.logger.log(`Unable to connect to the Mongodb database. Error: ${err}`, "error"); + }); + + const languages = require("../helpers/languages"); + this.translations = await languages(); + + // const autoUpdateDocs = require("../helpers/autoUpdateDocs"); + // autoUpdateDocs.update(this); + } + + // loadCommand(commandPath, commandName) { + // try { + // const props = new(require(`.${commandPath}${path.sep}${commandName}`))(this); + // this.logger.log(`Loading Command: ${props.help.name}. 👌`, "log"); + // props.conf.location = commandPath; + // if (props.init) props.init(this); + + // this.commands.set(props.help.name, props); + // props.help.aliases.forEach((alias) => { + // this.aliases.set(alias, props.help.name); + // }); + + // return false; + // } catch (e) { + // return `Unable to load command ${commandName}: ${e}`; + // } + // } + + // async unloadCommand(commandPath, commandName) { + // let command; + // if (this.commands.has(commandName)) command = this.commands.get(commandName); + // else if (this.aliases.has(commandName)) command = this.commands.get(this.aliases.get(commandName)); + + // if (!command) return `The command \`${commandName}\` doesn't seem to exist, nor is it an alias. Try again!`; + // if (command.shutdown) await command.shutdown(this); + + // delete require.cache[require.resolve(`.${commandPath}${path.sep}${commandName}.js`)]; + + // return false; + // } + // This function is used to find a user data or create it async findOrCreateUser({ id: userID }, isLean) { if (this.databaseCache.users.get(userID)) return isLean ? this.databaseCache.users.get(userID).toJSON() : this.databaseCache.users.get(userID); diff --git a/base/Log.js b/base/Log.js deleted file mode 100644 index 1fbadb6a..00000000 --- a/base/Log.js +++ /dev/null @@ -1,15 +0,0 @@ -const mongoose = require("mongoose"); - -module.exports = mongoose.model("Log", new mongoose.Schema({ - commandName: { type: String, default: "unknown" }, - date: { type: Number, default: Date.now() }, - author: { type: Object, default: { - username: "Unknown", - discrminator: "0000", - id: null - }}, - guild: { type: Object, default: { - name: "Unknown", - id: null - }} -})); \ No newline at end of file diff --git a/base/User.js b/base/User.js index dd309ee8..d7cf0758 100644 --- a/base/User.js +++ b/base/User.js @@ -84,17 +84,10 @@ const userSchema = new mongoose.Schema({ /* OTHER INFORMATIONS */ afk: { type: String, default: null }, // The AFK reason (if any) reminds: { type: Array, default: [] }, // The reminds of the user - playlists: { type: Array, default: [] }, // The playlists of the user logged: { type: Boolean, default: false }, // If the user is logged to the dashboard apiToken: { type: String, default: genToken() } // The API token of the user }); -userSchema.method("genApiToken", async function() { - this.apiToken = genToken(); - await this.save(); - return this.apiToken; -}); - userSchema.method("getAchievements", async function() { const canvas = Canvas.createCanvas(1800, 250), ctx = canvas.getContext("2d"); diff --git a/commands/Administration/addcommand.js b/commands/Administration/addcommand.js deleted file mode 100644 index 3a1b2856..00000000 --- a/commands/Administration/addcommand.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Addcommand extends Command { - constructor(client) { - super(client, { - name: "addcommand", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["addc"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (!args[0]) return message.error("administration/addcommand:MISSING_NAME"); - - const name = args[0].split("\n")[0]; - - if (this.client.commands.get(name) || this.client.aliases.get(name) || data.guild.customCommands.find((c) => c.name === name)) return message.error("administration/addcommand:COMMAND_ALREADY_EXISTS"); - - const answer = (args[0].split("\n")[1] || "") + args.slice(1).join(" "); - if (!answer) return message.error("administration/addcommand:MISSING_ANSWER"); - - data.guild.customCommands.push({ - name: name.toLowerCase(), - answer: answer - }); - data.guild.save(); - - message.success("administration/addcommand:SUCCESS", { - commandName: name - }); - } -} - -module.exports = Addcommand; \ No newline at end of file diff --git a/commands/Administration/addemoji.js b/commands/Administration/addemoji.js deleted file mode 100644 index e16706a7..00000000 --- a/commands/Administration/addemoji.js +++ /dev/null @@ -1,38 +0,0 @@ -const Command = require("../../base/Command"); - -class Addemoji extends Command { - constructor(client) { - super(client, { - name: "addemoji", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["adde"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const url = args[0]; - if (!url) return message.error("administration/addemoji:MISSING_URL"); - - const name = args[1] ? args[1].replace(/[^a-z0-9]/gi, "") : null; - if (!name) return message.error("administration/addemoji:MISSING_NAME"); - if (name.length < 2 || name.length > 32) return message.error("administration/addemoji:INVALID_NAME"); - - message.guild.emojis - .create(url, name) - .then(emoji => message.success("administration/addemoji:SUCCESS", { - emoji: emoji.name - })) - .catch(() => message.error("administration/addemoji:ERROR", { - emoji: name - })); - } -} - -module.exports = Addemoji; \ No newline at end of file diff --git a/commands/Administration/automod.js b/commands/Administration/automod.js deleted file mode 100644 index c19365bd..00000000 --- a/commands/Administration/automod.js +++ /dev/null @@ -1,55 +0,0 @@ -const Command = require("../../base/Command"); - -class Automod extends Command { - constructor(client) { - super(client, { - name: "automod", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["autom"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const status = args[0]; - if (!status || (status !== "on" && status !== "off")) return message.error("administration/automod:MISSING_STATUS"); - - if (status === "on") { - data.guild.plugins.automod = { - enabled: true, - ignored: [] - }; - data.guild.markModified("plugins.automod"); - data.guild.save(); - message.success("administration/automod:ENABLED", { - prefix: data.guild.prefix - }); - } else if (status === "off") { - if (message.mentions.channels.filter((ch) => ch.type === "GUILD_TEXT" && ch.guild.id === message.guild.id).first()) { - const channel = message.mentions.channels.first(); - data.guild.plugins.automod.ignored.push(channel); - data.guild.markModified("plugins.automod"); - data.guild.save(); - message.success("administration/automod:DISABLED_CHANNEL", { - channel: channel.toString() - }); - } else { - data.guild.plugins.automod = { - enabled: false, - ignored: [] - }; - data.guild.markModified("plugins.automod"); - data.guild.save(); - message.success("administration/automod:DISABLED"); - } - } - } -} - -module.exports = Automod; \ No newline at end of file diff --git a/commands/Administration/autorole.js b/commands/Administration/autorole.js deleted file mode 100644 index 234d4d42..00000000 --- a/commands/Administration/autorole.js +++ /dev/null @@ -1,60 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Autorole extends Command { - constructor(client) { - super(client, { - name: "autorole", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["autor"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const status = args[0]; - if (status !== "on" && status !== "off") return message.error("administration/autorole:MISSING_STATUS"); - - if (status === "on") { - const role = await Resolvers.resolveRole({ - message, - search: args.slice(1).join(" ") - }); - if (!role) return message.error("administration/autorole:MISSING_ROLE"); - - data.guild.plugins.autorole = { - enabled: true, - role: role.id - }; - data.guild.markModified("plugins.autorole"); - await data.guild.save(); - - message.success("administration/autorole:SUCCESS_ENABLED", { - roleName: role.name - }); - } else if (status === "off") { - if (!data.guild.plugins.autorole.enabled) return message.success("administration/autorole:ALREADY_DISABLED", { - prefix: data.guild.prefix - }); - - data.guild.plugins.autorole = { - enabled: false, - role: null - }; - data.guild.markModified("plugins.autorole"); - await data.guild.save(); - - message.success("administration/autorole:SUCCESS_DISABLED", { - prefix: data.guild.prefix - }); - } - } -} - -module.exports = Autorole; \ No newline at end of file diff --git a/commands/Administration/backup.js b/commands/Administration/backup.js deleted file mode 100644 index 0861f4da..00000000 --- a/commands/Administration/backup.js +++ /dev/null @@ -1,145 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - backup = require("discord-backup"); - -backup.setStorageFolder(__dirname + "/../../backups"); - -class Backup extends Command { - constructor(client) { - super(client, { - name: "backup", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ba"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ADMINISTRATOR"], - nsfw: false, - ownerOnly: false, - cooldown: 20000 - }); - } - - async run(message, args, data) { - const status = args[0]; - if (!status) return message.error("administration/backup:MISSING_STATUS"); - - if (status === "create") { - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - backup.create(message.guild).then((backup) => { - m.delete(); - - message.success("administration/backup:SUCCESS_PUBLIC"); - message.author.send(message.translate("administration/backup:SUCCESS_PRIVATE", { - backupID: backup.id - })).catch(() => { - backup.remove(backup.id); - message.error("misc:CANNOT_DM"); - }); - }).catch((err) => { - console.error(err); - return message.error("misc:ERR_OCCURRED"); - }); - } else if (status === "load") { - const backupID = args[1]; - if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); - - backup.fetch(backupID).then(async () => { - message.sendT("administration/backup:CONFIRMATION"); - - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ - filter, - time: 20000 - }); - - collector.on("collect", async msg => { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - message.author.send(message.translate("administration/backup:START_LOADING")); - - backup.load(backupID, message.guild).then(() => { - backup.remove(backupID); - message.author.send(message.translate("administration/backup:LOAD_SUCCESS")); - collector.stop(); - }).catch((err) => { - console.error(err); - return message.error("misc:ERR_OCCURRED"); - }); - } - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - }).catch((err) => { - console.error(err); - return message.error("administration/backup:NO_BACKUP_FOUND", { - backupID - }); - }); - } else if (status === "info") { - const backupID = args[1]; - if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); - - backup.fetch(backupID).then(async (backupInfo) => { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("administration/backup:TITLE_INFO") - }) - .addField(message.translate("administration/backup:TITLE_ID"), backupInfo.id, true) - .addField(message.translate("administration/backup:TITLE_SERVER_ID"), backupInfo.data.guildID.toString(), true) - .addField(message.translate("administration/backup:TITLE_SIZE"), `${backupInfo.size} kb`, true) - .addField(message.translate("administration/backup:TITLE_CREATED_AT"), message.printDate(new Date(backupInfo.data.createdTimestamp)), true) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - message.reply({ - embeds: [embed] - }); - }).catch((err) => { - console.error(err); - return message.error("administration/backup:NO_BACKUP_FOUND", { - backupID - }); - }); - } else if (status === "remove") { - const backupID = args[1]; - if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); - - backup.fetch(backupID).then(async () => { - message.sendT("administration/backup:REMOVE_CONFIRMATION"); - - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ - filter, - time: 20000 - }); - - collector.on("collect", async msg => { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - backup.remove(backupID).then(async () => { - message.success("administration/backup:SUCCESS_REMOVED"); - }); - collector.stop(); - } - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - }).catch((err) => { - console.error(err); - return message.error("administration/backup:NO_BACKUP_FOUND", { - backupID - }); - }); - } else { - return message.error("administration/backup:MISSING_STATUS"); - } - } -} - -module.exports = Backup; \ No newline at end of file diff --git a/commands/Administration/configuration.js b/commands/Administration/configuration.js deleted file mode 100644 index e6d75ef2..00000000 --- a/commands/Administration/configuration.js +++ /dev/null @@ -1,98 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Configuration extends Command { - constructor(client) { - super(client, { - name: "configuration", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["conf", "config"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const guildData = data.guild; - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.guild.name, - iconURL: message.guild.iconURL({ - dynamic: true - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - // Guild prefix - embed.addField(message.translate("administration/configuration:PREFIX_TITLE"), guildData.prefix); - - // Ignored channels - embed.addField(message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"), guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS")); - - // Autorole plugin - embed.addField(message.translate("administration/configuration:AUTOROLE_TITLE"), guildData.plugins.autorole.enabled ? message.translate("administration/configuration:AUTOROLE_CONTENT", { - roleName: `<@&${guildData.plugins.autorole.role}>` - }) : message.translate("administration/configuration:AUTOROLE_DISABLED")); - - // Welcome plugin - embed.addField(message.translate("administration/configuration:WELCOME_TITLE"), guildData.plugins.welcome.enabled ? message.translate("administration/configuration:WELCOME_CONTENT", { - channel: `<#${guildData.plugins.welcome.channel}>`, - withImage: guildData.plugins.welcome.withImage ? message.translate("common:YES") : message.translate("common:NO") - }) : message.translate("administration/configuration:WELCOME_DISABLED")); - - // Goodbye plugin - embed.addField(message.translate("administration/configuration:GOODBYE_TITLE"), guildData.plugins.goodbye.enabled ? message.translate("administration/configuration:GOODBYE_CONTENT", { - channel: `<#${guildData.plugins.goodbye.channel}>`, - withImage: guildData.plugins.goodbye.withImage ? message.translate("common:YES") : message.translate("common:NO") - }) : message.translate("administration/configuration:GOODBYE_DISABLED")); - - // Special channels - embed.addField(message.translate("administration/configuration:SPECIAL_CHANNELS"), - message.translate("administration/configuration:SUGGESTIONS", { - channel: guildData.plugins.suggestions ? `<#${guildData.plugins.suggestions}>` : message.translate("common:NOT_DEFINED") - }) + "\n" + - message.translate("administration/configuration:REPORTS", { - channel: guildData.plugins.reports ? `<#${guildData.plugins.reports}>` : message.translate("common:NOT_DEFINED") - }) + "\n" + - message.translate("administration/configuration:MODLOGS", { - channel: guildData.plugins.modlogs ? `<#${guildData.plugins.modlogs}>` : message.translate("common:NOT_DEFINED") - }) + "\n" + - message.translate("administration/configuration:BIRTHDAYS", { - channel: guildData.plugins.birthdays ? `<#${guildData.plugins.birthdays}>` : message.translate("common:NOT_DEFINED") - }) - ); - - // Auto sanctions - embed.addField(message.translate("administration/configuration:AUTO_SANCTIONS"), (guildData.plugins.warnsSanctions.kick ? message.translate("administration/configuration:KICK_CONTENT", { - count: guildData.plugins.warnsSanctions.kick - }) : message.translate("administration/configuration:KICK_NOT_DEFINED")) + "\n" + (guildData.plugins.warnsSanctions.ban ? message.translate("administration/configuration:BAN_CONTENT", { - count: guildData.plugins.warnsSanctions.ban - }) : message.translate("administration/configuration:BAN_NOT_DEFINED"))); - - // Automod plugin - embed.addField(message.translate("administration/configuration:AUTOMOD_TITLE"), guildData.plugins.automod.enabled ? message.translate("administration/configuration:AUTOMOD_CONTENT", { - channels: guildData.plugins.automod.ignored.map((ch) => `<#${ch}>`) - }) : message.translate("administration/configuration:AUTOMOD_DISABLED")); - - // Auto-delete mod commands - embed.addField(message.translate("administration/configuration:AUTODELETEMOD"), guildData.autoDeleteModCommands ? message.translate("administration/configuration:AUTODELETEMOD_ENABLED") : message.translate("administration/configuration:AUTODELETEMOD_DISABLED")); - - // Dashboard link - embed.addField(message.translate("administration/configuration:DASHBOARD_TITLE"), `[${message.translate("administration/configuration:DASHBOARD_CONTENT")}](${data.config.dashboard.baseURL})`); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Configuration; \ No newline at end of file diff --git a/commands/Administration/delcommand.js b/commands/Administration/delcommand.js deleted file mode 100644 index 183a3427..00000000 --- a/commands/Administration/delcommand.js +++ /dev/null @@ -1,33 +0,0 @@ -const Command = require("../../base/Command"); - -class Delcommand extends Command { - constructor(client) { - super(client, { - name: "delcommand", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["delc"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const name = args[0]; - if (!name) return message.error("administration/delcommand:MISSING_NAME"); - if (!data.guild.customCommands.find((c) => c.name === name)) return message.error("administration/delcommand:UNKNOWN_COMMAND", { commandName: name }); - - data.guild.customCommands = data.guild.customCommands.filter((c) => c.name !== name); - data.guild.save(); - - message.success("administration/delcommand:SUCCESS", { - commandName: name - }); - } -} - -module.exports = Delcommand; \ No newline at end of file diff --git a/commands/Administration/deletemod.js b/commands/Administration/deletemod.js deleted file mode 100644 index ce4c9500..00000000 --- a/commands/Administration/deletemod.js +++ /dev/null @@ -1,35 +0,0 @@ -const Command = require("../../base/Command"); - -class Deletemod extends Command { - constructor(client) { - super(client, { - name: "deletemod", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["delm"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const status = args[0]; - if (!status || status !== "on" && status !== "off") return message.error("administration/deletemod:MISSING_STATUS"); - - if (status === "on") { - data.guild.autoDeleteModCommands = true; - data.guild.save(); - message.success("administration/deletemod:ENABLED"); - } else { - data.guild.autoDeleteModCommands = false; - data.guild.save(); - message.success("administration/deletemod:DISABLED"); - } - } -} - -module.exports = Deletemod; \ No newline at end of file diff --git a/commands/Administration/goodbye.js b/commands/Administration/goodbye.js deleted file mode 100644 index 8a2c1573..00000000 --- a/commands/Administration/goodbye.js +++ /dev/null @@ -1,108 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Goodbye extends Command { - constructor(client) { - super(client, { - name: "goodbye", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["gb"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (args[0] === "test" && data.guild.plugins.goodbye.enabled) { - this.client.emit("guildMemberRemove", message.member); - return message.success("administration/goodbye:TEST_SUCCESS"); - } - - if ((!args[0] || !["edit", "off"].includes(args[0])) && data.guild.plugins.goodbye.enabled) return message.error("administration/goodbye:MISSING_STATUS"); - - if (args[0] === "off") { - data.guild.plugins.goodbye = { - enabled: false, - message: null, - channelID: null, - withImage: null - }; - data.guild.markModified("plugins.goodbye"); - data.guild.save(); - return message.error("administration/goodbye:DISABLED", { - prefix: data.guild.prefix - }); - } else { - const goodbye = { - enabled: true, - channel: null, - message: null, - withImage: null, - }; - - message.sendT("administration/goodbye:FORM_1", { - author: message.author.toString() - }); - - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ - filter, - time: 120000 // 2 minutes - }); - - collector.on("collect", async msg => { - // If the message is filled, it means the user sent yes or no for the image - if (goodbye.message) { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) goodbye.withImage = true; - else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) goodbye.withImage = false; - else return message.error("misc:INVALID_YES_NO"); - - data.guild.plugins.goodbye = goodbye; - data.guild.markModified("plugins.goodbye"); - await data.guild.save(); - message.sendT("administration/goodbye:FORM_SUCCESS", { - prefix: data.guild.prefix, - channel: `<#${goodbye.channel}>` - }); - return collector.stop(); - } - - // If the channel is filled and the message is not, it means the user sent the message - if (goodbye.channel && !goodbye.message) { - if (msg.content.length < 1800) { - goodbye.message = msg.content; - return message.sendT("administration/goodbye:FORM_3"); - } - return message.error("administration/goodbye:MAX_CHARACT"); - } - - // If the channel is not filled, it means the user sent it - if (!goodbye.channel) { - const channel = await Resolvers.resolveChannel({ - message: msg, - channelType: "GUILD_TEXT" - }); - if (!channel) return message.error("misc:INVALID_CHANNEL"); - - goodbye.channel = channel.id; - return message.sendT("administration/goodbye:FORM_2", { - channel: channel.toString(), - author: msg.author.tag, - memberCount: msg.guild.memberCount - }); - } - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - } - } -} - -module.exports = Goodbye; \ No newline at end of file diff --git a/commands/Administration/ignore.js b/commands/Administration/ignore.js deleted file mode 100644 index 23070a0d..00000000 --- a/commands/Administration/ignore.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Ignore extends Command { - constructor(client) { - super(client, { - name: "ignore", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ig"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const channel = message.mentions.channels.filter((ch) => ch.type === "GUILD_TEXT" && ch.guild.id === message.guild.id).first(); - if (!channel) return message.error("misc:INVALID_CHANNEL"); - - const ignored = data.guild.ignoredChannels.includes(channel.id); - - if (ignored) { - data.guild.ignoredChannels = data.guild.ignoredChannels.filter((ch) => ch !== channel.id); - data.guild.save(); - return message.success("administration/ignore:ALLOWED", { - channel: channel.toString() - }); - } else if (!ignored) { - data.guild.ignoredChannels.push(channel.id); - data.guild.save(); - return message.success("administration/ignore:IGNORED", { - channel: channel.toString() - }); - } - } -} - -module.exports = Ignore; \ No newline at end of file diff --git a/commands/Administration/set.js b/commands/Administration/set.js deleted file mode 100644 index 013784b5..00000000 --- a/commands/Administration/set.js +++ /dev/null @@ -1,57 +0,0 @@ -const Command = require("../../base/Command"); - -class Set extends Command { - constructor(client) { - super(client, { - name: "set", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - const status = args[0]; - if (!status || !["level", "xp", "credits", "bank"].includes(status)) return message.error("administration/set:NO_STATUS"); - - const member = await this.client.resolveMember(args[1], message.guild); - if (!member) return message.error("administration/set:INVALID_MEMBER"); - if (member.user.bot) return message.error("administration/set:BOT_USER"); - - const number = args[2]; - if (!number || isNaN(number) || parseInt(number, 10) < 0) return message.error("administration/set:INVALID_AMOUNT"); - const amount = Math.ceil(parseInt(number, 10)); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - if (status === "level") { - memberData.level = parseInt(amount, 10); - memberData.save(); - } else if (status === "xp") { - memberData.exp = parseInt(amount, 10); - memberData.save(); - } else if (status === "credits") { - memberData.money = parseInt(amount, 10); - memberData.save(); - } else if (status === "bank") { - memberData.bankSold = parseInt(amount, 10); - memberData.save(); - } - - message.success("administration/set:SUCCESS_" + status.toUpperCase(), { - username: member.user.tag, - amount - }); - } -} - -module.exports = Set; \ No newline at end of file diff --git a/commands/Administration/setbirthdays.js b/commands/Administration/setbirthdays.js deleted file mode 100644 index 660d9091..00000000 --- a/commands/Administration/setbirthdays.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Setbirthdays extends Command { - constructor(client) { - super(client, { - name: "setbirthdays", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setb"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const areBirthdaysEnabled = Boolean(data.guild.plugins.birthdays); - const sentChannel = await Resolvers.resolveChannel({ - message, - search: args.join(" "), - channelType: "GUILD_TEXT" - }); - - if (!sentChannel && areBirthdaysEnabled) { - data.guild.plugins.birthdays = null; - data.guild.markModified("plugins.birthdays"); - await data.guild.save(); - return message.success("administration/setbirthdays:DISABLED"); - } else { - const channel = sentChannel || message.channel; - data.guild.plugins.birthdays = channel.id; - data.guild.markModified("plugins.birthdays"); - await data.guild.save(); - return message.success("administration/setbirthdays:ENABLED", { - channel: channel.toString() - }); - } - } -} - -module.exports = Setbirthdays; \ No newline at end of file diff --git a/commands/Administration/setlang.js b/commands/Administration/setlang.js deleted file mode 100644 index 9c092c77..00000000 --- a/commands/Administration/setlang.js +++ /dev/null @@ -1,33 +0,0 @@ -const Command = require("../../base/Command"); - -class Setlang extends Command { - constructor(client) { - super(client, { - name: "setlang", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setl"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const language = this.client.languages.find((l) => l.name === args[0] || l.aliases.includes(args[0])); - - if (!args[0] || !language) return message.error("administration/setlang:MISSING_LANG", { list: this.client.languages.map((l) => `\`${l.name} (${l.aliases.slice(0, 2).join(", ")})\``).join(", ") }); - - data.guild.language = language.name; - await data.guild.save(); - - return message.sendT("administration/setlang:SUCCESS", { - lang: language.nativeName - }); - } -} - -module.exports = Setlang; \ No newline at end of file diff --git a/commands/Administration/setmodlogs.js b/commands/Administration/setmodlogs.js deleted file mode 100644 index 6a5cc145..00000000 --- a/commands/Administration/setmodlogs.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Setmodlogs extends Command { - constructor(client) { - super(client, { - name: "setmodlogs", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setm"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const areModLogsEnabled = Boolean(data.guild.plugins.modlogs); - const sentChannel = await Resolvers.resolveChannel({ - message, - search: args.join(" "), - channelType: "GUILD_TEXT" - }); - - if (!sentChannel && areModLogsEnabled) { - data.guild.plugins.modlogs = null; - data.guild.markModified("plugins.modlogs"); - await data.guild.save(); - return message.success("administration/setmodlogs:DISABLED"); - } else { - const channel = sentChannel || message.channel; - data.guild.plugins.modlogs = channel.id; - data.guild.markModified("plugins.modlogs"); - await data.guild.save(); - return message.success("administration/setmodlogs:ENABLED", { - channel: channel.toString() - }); - } - } -} - -module.exports = Setmodlogs; \ No newline at end of file diff --git a/commands/Administration/setprefix.js b/commands/Administration/setprefix.js deleted file mode 100644 index a680f126..00000000 --- a/commands/Administration/setprefix.js +++ /dev/null @@ -1,33 +0,0 @@ -const Command = require("../../base/Command"); - -class Setprefix extends Command { - constructor(client) { - super(client, { - name: "setprefix", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setp"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const prefix = args[0]; - if (!prefix) return message.error("administration/setprefix:MISSING_PREFIX"); - if (prefix.length > 5) return message.error("administration/setprefix:TOO_LONG"); - - data.guild.prefix = prefix; - data.guild.save(); - - return message.success("administration/setprefix:SUCCESS", { - prefix - }); - } -} - -module.exports = Setprefix; \ No newline at end of file diff --git a/commands/Administration/setreports.js b/commands/Administration/setreports.js deleted file mode 100644 index 7e73f550..00000000 --- a/commands/Administration/setreports.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Setreports extends Command { - constructor(client) { - super(client, { - name: "setreports", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setr"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const areReportsEnabled = Boolean(data.guild.plugins.reports); - const sentChannel = await Resolvers.resolveChannel({ - message, - search: args.join(" "), - channelType: "GUILD_TEXT" - }); - - if (!sentChannel && areReportsEnabled) { - data.guild.plugins.reports = null; - data.guild.markModified("plugins.reports"); - await data.guild.save(); - return message.success("administration/setreports:DISABLED"); - } else { - const channel = sentChannel || message.channel; - data.guild.plugins.reports = channel.id; - data.guild.markModified("plugins.reports"); - await data.guild.save(); - return message.success("administration/setreports:ENABLED", { - channel: channel.toString() - }); - } - } -} - -module.exports = Setreports; \ No newline at end of file diff --git a/commands/Administration/setsuggests.js b/commands/Administration/setsuggests.js deleted file mode 100644 index 5bdf3664..00000000 --- a/commands/Administration/setsuggests.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Setsuggests extends Command { - constructor(client) { - super(client, { - name: "setsuggests", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setsu"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const areSuggestsEnabled = Boolean(data.guild.plugins.suggestions); - const sentChannel = await Resolvers.resolveChannel({ - message, - search: args.join(" "), - channelType: "GUILD_TEXT" - }); - - if (!sentChannel && areSuggestsEnabled) { - data.guild.plugins.suggestions = null; - data.guild.markModified("plugins.suggestions"); - await data.guild.save(); - return message.success("administration/setsuggests:DISABLED"); - } else { - const channel = sentChannel || message.channel; - data.guild.plugins.suggestions = channel.id; - data.guild.markModified("plugins.suggestions"); - await data.guild.save(); - return message.success("administration/setsuggests:ENABLED", { - channel: channel.toString() - }); - } - } -} - -module.exports = Setsuggests; \ No newline at end of file diff --git a/commands/Administration/slowmode.js b/commands/Administration/slowmode.js deleted file mode 100644 index df3a5094..00000000 --- a/commands/Administration/slowmode.js +++ /dev/null @@ -1,54 +0,0 @@ -const Command = require("../../base/Command"), - ms = require("ms"); - -class Slowmode extends Command { - constructor(client) { - super(client, { - name: "slowmode", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["sl"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const channel = message.mentions.channels.filter((ch) => ch.type === "GUILD_TEXT" && ch.guild.id === message.guild.id).first(); - if (!channel) return message.error("misc:INVALID_CHANNEL"); - - const time = args[1]; - if (!time) { - if (!data.guild.slowmode.channels.find((ch) => ch.id === channel.id)) return message.error("misc:INVALID_TIME"); - - data.guild.slowmode.channels = data.guild.slowmode.channels.filter((ch) => ch.id !== channel.id); - data.guild.markModified("slowmode.channels"); - data.guild.save(); - message.success("administration/slowmode:DISABLED", { - prefix: data.guild.prefix, - channel: `#${channel.name}` - }); - } else { - if (isNaN(ms(time))) return message.error("misc:INVALID_TIME"); - if (data.guild.slowmode.channels.find((ch) => ch.id === channel.id)) data.guild.slowmode.channels = data.guild.slowmode.channels.filter((ch) => ch.id !== channel.id); - - data.guild.slowmode.channels.push({ - id: channel.id, - time: ms(time) - }); - data.guild.markModified("slowmode.channels"); - data.guild.save(); - message.success("administration/slowmode:ENABLED", { - prefix: data.guild.prefix, - channel: `#${channel.name}`, - time: this.client.functions.convertTime(message.guild, ms(time)) - }); - } - } -} - -module.exports = Slowmode; \ No newline at end of file diff --git a/commands/Administration/stealemoji.js b/commands/Administration/stealemoji.js deleted file mode 100644 index 7c7d3709..00000000 --- a/commands/Administration/stealemoji.js +++ /dev/null @@ -1,39 +0,0 @@ -const Command = require("../../base/Command"), - { Util } = require("discord.js"); - -class Stealemoji extends Command { - constructor(client) { - super(client, { - name: "stealemoji", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["steale"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - if (!args.length) return message.error("administration/stealemoji:MISSING_EMOJI"); - - for (const rawEmoji of args) { - const parsedEmoji = Util.parseEmoji(rawEmoji); - const extension = parsedEmoji.animated ? "gif" : "png"; - - message.guild.emojis - .create(`https://cdn.discordapp.com/emojis/${parsedEmoji.id}.${extension}`, parsedEmoji.name) - .then(emoji => message.success("administration/stealemoji:SUCCESS", { - emoji: emoji.name - })) - .catch(() => message.error("administration/stealemoji:ERROR", { - emoji: parsedEmoji.name - })); - } - } -} - -module.exports = Stealemoji; \ No newline at end of file diff --git a/commands/Administration/welcome.js b/commands/Administration/welcome.js deleted file mode 100644 index 2e2bd7ad..00000000 --- a/commands/Administration/welcome.js +++ /dev/null @@ -1,111 +0,0 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); - -class Welcome extends Command { - constructor(client) { - super(client, { - name: "welcome", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["welc"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (args[0] === "test" && data.guild.plugins.welcome.enabled) { - this.client.emit("guildMemberAdd", message.member); - return message.success("administration/welcome:TEST_SUCCESS"); - } - - if ((!args[0] || !["edit", "off"].includes(args[0])) && data.guild.plugins.welcome.enabled) return message.error("administration/welcome:MISSING_STATUS"); - - if (args[0] === "off") { - data.guild.plugins.welcome = { - enabled: false, - message: null, - channelID: null, - withImage: null - }; - data.guild.markModified("plugins.welcome"); - data.guild.save(); - return message.error("administration/welcome:DISABLED", { - prefix: data.guild.prefix - }); - } else { - const welcome = { - enabled: true, - channel: null, - message: null, - withImage: null, - }; - - message.sendT("administration/welcome:FORM_1", { - author: message.author.toString() - }); - - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ - filter, - time: 120000 // 2 minutes - }); - - collector.on("collect", async msg => { - // If the message is filled, it means the user sent yes or no for the image - if (welcome.message) { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - welcome.withImage = true; - } else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { - welcome.withImage = false; - } else { - return message.error("misc:INVALID_YES_NO"); - } - data.guild.plugins.welcome = welcome; - data.guild.markModified("plugins.welcome"); - await data.guild.save(); - message.sendT("administration/welcome:FORM_SUCCESS", { - prefix: data.guild.prefix, - channel: `<#${welcome.channel}>` - }); - return collector.stop(); - } - - // If the channel is filled and the message is not, it means the user sent the message - if (welcome.channel && !welcome.message) { - if (msg.content.length < 1800) { - welcome.message = msg.content; - return message.sendT("administration/welcome:FORM_3"); - } - return message.error("administration/goodbye:MAX_CHARACT"); - } - - // If the channel is not filled, it means the user sent it - if (!welcome.channel) { - const channel = await Resolvers.resolveChannel({ - message: msg, - channelType: "GUILD_TEXT" - }); - if (!channel) return message.error("misc:INVALID_CHANNEL"); - - welcome.channel = channel.id; - return message.sendT("administration/welcome:FORM_2", { - guildName: message.guild.name, - author: msg.author.tag, - memberCount: msg.guild.memberCount - }); - } - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - } - } -} - -module.exports = Welcome; \ No newline at end of file diff --git a/commands/Economy/achievements.js b/commands/Economy/achievements.js deleted file mode 100644 index ea8c6180..00000000 --- a/commands/Economy/achievements.js +++ /dev/null @@ -1,80 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Achievements extends Command { - constructor(client) { - super(client, { - name: "achievements", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ac"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let member = message.guild ? message.member : message.author; - if (args[0]) member = await this.client.resolveMember(args[0], message.guild); - if (message.guild && member.user.bot) return message.error("economy/profile:BOT_USER"); - - const userData = (member.id === message.author.id ? data.userData : await this.client.findOrCreateUser({ - id: member.id - })); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/achievements:TITLE") - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - embed.addField(message.translate("economy/achievements:SEND_CMD"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.firstCommand.progress.now, - total: userData.achievements.firstCommand.progress.total, - percent: Math.round(100 * (userData.achievements.firstCommand.progress.now / userData.achievements.firstCommand.progress.total)) - })); - embed.addField(message.translate("economy/achievements:CLAIM_SALARY"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.work.progress.now, - total: userData.achievements.work.progress.total, - percent: Math.round(100 * (userData.achievements.work.progress.now / userData.achievements.work.progress.total)) - })); - embed.addField(message.translate("economy/achievements:MARRY"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.married.progress.now, - total: userData.achievements.married.progress.total, - percent: Math.round(100 * (userData.achievements.married.progress.now / userData.achievements.married.progress.total)) - })); - embed.addField(message.translate("economy/achievements:SLOTS"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.slots.progress.now, - total: userData.achievements.slots.progress.total, - percent: Math.round(100 * (userData.achievements.slots.progress.now / userData.achievements.slots.progress.total)) - })); - embed.addField(message.translate("economy/achievements:TIP"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.tip.progress.now, - total: userData.achievements.tip.progress.total, - percent: Math.round(100 * (userData.achievements.tip.progress.now / userData.achievements.tip.progress.total)) - })); - embed.addField(message.translate("economy/achievements:REP"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.rep.progress.now, - total: userData.achievements.rep.progress.total, - percent: Math.round(100 * (userData.achievements.rep.progress.now / userData.achievements.rep.progress.total)) - })); - embed.addField(message.translate("economy/achievements:INVITE"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.invite.progress.now, - total: userData.achievements.invite.progress.total, - percent: Math.round(100 * (userData.achievements.invite.progress.now / userData.achievements.invite.progress.total)) - })); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Achievements; \ No newline at end of file diff --git a/commands/Economy/birthdate.js b/commands/Economy/birthdate.js deleted file mode 100644 index 85e400a5..00000000 --- a/commands/Economy/birthdate.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"); - -class Birthdate extends Command { - constructor(client) { - super(client, { - name: "birthdate", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["bd"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const date = args[0]; - if (!date) return message.error("economy/birthdate:MISSING_DATE"); - - const tArgs = date.split("/"); - const [day, month, year] = tArgs; - if (!day || !month || !year) return message.error("economy/birthdate:INVALID_DATE"); - - const match = date.match(/\d+/g); - if (!match) return message.error("economy/birthdate:INVALID_DATE"); - - const tday = +match[0], - tmonth = +match[1] - 1; - let tyear = +match[2]; - - if (tyear < 100) tyear += tyear < 50 ? 2000 : 1900; - - const d = new Date(tyear, tmonth, tday); - if (!(tday == d.getDate() && tmonth == d.getMonth() && tyear == d.getFullYear())) return message.error("economy/birthdate:INVALID_DATE"); - if (d.getTime() > Date.now()) return message.error("economy/birthdate:DATE_TOO_HIGH"); - if (d.getTime() < (Date.now() - 2.523e+12)) return message.error("economy/birthdate:DATE_TOO_LOW"); - - data.userData.birthdate = d; - data.userData.save(); - - message.success("economy/birthdate:SUCCESS", { - date: message.printDate(d) - }); - } -} - -module.exports = Birthdate; \ No newline at end of file diff --git a/commands/Economy/deposit.js b/commands/Economy/deposit.js deleted file mode 100644 index 3cdd2547..00000000 --- a/commands/Economy/deposit.js +++ /dev/null @@ -1,52 +0,0 @@ -const Command = require("../../base/Command"); - -class Deposit extends Command { - constructor(client) { - super(client, { - name: "deposit", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["bank", "dep"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let amount = args[0]; - - if (!(parseInt(data.memberData.money, 10) > 0)) return message.error("economy/deposit:NO_CREDIT"); - - if (args[0] === "all") { - amount = parseInt(data.memberData.money, 10); - } else { - if (isNaN(amount) || parseInt(amount, 10) < 1) return message.error("economy/deposit:MISSING_AMOUNT"); - amount = parseInt(amount, 10); - } - - if (data.memberData.money < amount) return message.error("economy/deposit:NOT_ENOUGH_CREDIT", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` }); - - const info = { - user: message.translate("economy/transactions:BANK"), - amount: amount, - date: Date.now(), - type: "send" - }; - - data.memberData.transactions.push(info); - - data.memberData.money = data.memberData.money - amount; - data.memberData.bankSold = data.memberData.bankSold + amount; - data.memberData.save(); - - message.success("economy/deposit:SUCCESS", { - money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - }); - } -} - -module.exports = Deposit; \ No newline at end of file diff --git a/commands/Economy/divorce.js b/commands/Economy/divorce.js deleted file mode 100644 index 84aabcf4..00000000 --- a/commands/Economy/divorce.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"); - -class Divorce extends Command { - constructor(client) { - super(client, { - name: "divorce", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["di"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (!data.userData.lover) return message.error("economy/divorce:NOT_MARRIED"); - - const user = this.client.users.cache.get(data.userData.lover) || await this.client.users.fetch(data.userData.lover); - - data.userData.lover = null; - data.userData.save(); - - const oldLover = await this.client.findOrCreateUser({ - id: user.id - }); - oldLover.lover = null; - oldLover.save(); - - message.success("economy/divorce:DIVORCED", { - username: user.username - }); - - user.send({ - content: message.translate("economy/divorce:DIVORCED_U", { - username: message.author.username - }) - }); - } -} - -module.exports = Divorce; \ No newline at end of file diff --git a/commands/Economy/findwords.js b/commands/Economy/findwords.js deleted file mode 100644 index 3770f792..00000000 --- a/commands/Economy/findwords.js +++ /dev/null @@ -1,157 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const currentGames = {}; - -class FindWords extends Command { - constructor(client) { - super(client, { - name: "findwords", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["findw"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (currentGames[message.guild.id]) return message.error("economy/number:GAME_RUNNING"); - - // Reads words file - let lang = null; - if (message.guild.data.language === "uk-UA") return lang = "ru-RU"; - else lang = message.guild.data.language; - - const wordList = require(`../../assets/json/words/${lang}.json`); - - // Init some utils variables - const participants = [], - winners = [], - words = [], - nbGames = this.client.functions.randomNum(3, 10); - - // Store the date wich the game has started - const createdAt = Date.now(); // 20929038303 - - for (let i = 0; i < nbGames; i++) { - const result = Math.floor((Math.random() * wordList.length)); - words.push(wordList[result].substring(0, 3).toLowerCase()); - } - - let i = 0; // Inits i variable to count games - currentGames[message.guild.id] = true; // Update current game variable - generateGame.call(this, words[i]); // Generate a new round - - function generateGame(word) { - word = word.toLowerCase(); - - // Launch timer - const delay = (i === 0) ? 10000 : 0; - if (i === 0) message.sendT("economy/findwords:GAME_STARTING"); - - setTimeout(() => { - // Send announcment message - message.sendT("economy/findwords:FIND_WORD", { - word: word.toUpperCase() - }, false, false, "warn"); - - // init a collector to receive the answers - const filter = m => !m.author.bot; - const collector = new Discord.MessageCollector(message.channel, { - filter, - time: 20000 - }); - - collector.on("collect", (msg) => { - if (this.client.functions.getPrefix(msg, data)) return; - if (!participants.includes(msg.author.id)) participants.push(msg.author.id); - if (msg.content === "STOP") return collector.stop("force"); - if (msg.content.toLowerCase().indexOf(word) >= 0 && wordList.map((word) => word.toLowerCase()).indexOf(msg.content.toLowerCase()) >= 0) { - collector.stop(msg.author.id); // Stop the collector - } else msg.error("economy/findwords:INVALID_WORD", { member: msg.author.toString() }); - }); - - collector.on("end", async (collected, reason) => { - if (reason === "time") message.error("economy/findwords:NO_WINNER"); - else if (reason === "force") return message.error("misc:FORCE_STOP", { user: message.author.toString() }); - else { - message.success("economy/findwords:WORD_FOUND", { - winner: `<@${reason}>` - }); - winners.push(reason); - } - - if (i < nbGames - 1) { - i++; - generateGame.call(this, words[i]); - } else { - currentGames[message.guild.id] = false; - if (winners.length < 1) return message.error("economy/findwords:NO_WINNER_ALL"); - - const winnerID = await getWinner(winners); - const time = message.convertTime(createdAt, "from", true); - const user = await this.client.users.fetch(winnerID); - message.sendT("economy/findwords:GAME_STATS", { - winner: user.username, - duration: time, - participantCount: participants.length, - participants: participants.map((p) => `<@${p}>`).join(", ") - }); - if (participants.length > 1 && data.guild.disabledCategories && !data.guild.disabledCategories.includes("Economy")) { - const won = 150 * (participants.length * 0.5); - - message.sendT("economy/findwords:CREDITS", { - winner: user.username, - credits: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - }); - - const memberData = await this.client.findOrCreateMember({ - id: user.id, - guildID: message.guild.id - }); - - const info = { - user: message.translate("economy/transactions:WORDS"), - amount: won, - date: Date.now(), - type: "got" - }; - - data.memberData.transactions.push(info); - - memberData.money += won; - memberData.save(); - } - } - }); - }, delay); - } - - async function getWinner(array) { - return new Promise(function (resolve) { - const counts = {}; - let compare = 0, - mostFrequent; - - for (let i = 0, len = array.length; i < len; i++) { - const winner = array[i]; - if (!counts[winner]) counts[winner] = 1; - else counts[winner] = counts[winner] + 1; - - if (counts[winner] > compare) { - compare = counts[winner]; - mostFrequent = array[i]; - } - } - resolve(mostFrequent); - }); - } - } -} - -module.exports = FindWords; \ No newline at end of file diff --git a/commands/Economy/horserace.js b/commands/Economy/horserace.js deleted file mode 100644 index 650db328..00000000 --- a/commands/Economy/horserace.js +++ /dev/null @@ -1,184 +0,0 @@ -const Command = require("../../base/Command"); - -const games = {}; - -class Horserace extends Command { - constructor(client) { - super(client, { - name: "horserace", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["hr"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (!args[0]) return message.error("economy/horserace:MISSING_STATUS"); - const author = message.author; - - if (args[0] === "create") { - let thisGame = games[message.channel.id]; - - if (thisGame) return message.error("economy/horserace:GAME_RUNNING"); - else { - games[message.channel.id] = { - horseSpeeds: [], - bets: [] - }; - - thisGame = games[message.channel.id]; - - const f = []; - for (let i = 0; i < 5; i++) { - const speed = this.client.functions.randomNum(1, 5); - const profit = { - 1: 3.5, - 2: 3, - 3: 2.5, - 4: 2, - 5: 1.5, - }; - // const profit = Math.floor((((8.9 / 9) * (6 - speed)) + 1.1) * 10) / 10; - thisGame.horseSpeeds.push(speed); - f.push({ - name: message.translate("economy/horserace:HORSE_NAME", { - number: i + 1 - }), - value: message.translate("economy/horserace:HORSE_VALUE", { - speed, - profit: profit[speed] - }) - }); - } - message.reply({ - embeds: [{ - color: data.config.embed.color, - title: message.translate("economy/horserace:EMBED_T"), - fields: f - }] - }); - } - } else if (args[0] === "bet") { - const thisGame = games[message.channel.id]; - const horse = parseInt(args[1]); - const amount = parseInt(args[2]); - - if (horse > 5) return message.error("economy/horserace:HORSE_NUM"); - if (!thisGame) return message.error("economy/horserace:NO_GAME_RUNNING"); - - if (!amount || isNaN(amount) || parseInt(amount, 10) <= 0) return message.error("economy/pay:INVALID_AMOUNT"); - if (amount > data.memberData.money) return message.error("economy/pay:ENOUGH_MONEY", { - amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}` - }); - - thisGame.bets[author.id] = { - amount, - horse - }; - - message.sendT("economy/horserace:BET", { - user: author, - amount: `**${Math.floor(amount)}** ${message.getNoun(Math.floor(amount), message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}`, - horse - }); - - } else if (args[0] === "go") { - const thisGame = games[message.channel.id]; - const horsePositions = [0, 0, 0, 0, 0]; - - if (!thisGame) return message.error("economy/horserace:NO_GAME_RUNNING"); - - // eslint-disable-next-line no-constant-condition - while (true) { - for (let i = 0; i < 5; i++) { - if (thisGame.horseSpeeds[i] >= Math.floor(Math.random() * 15)) { - horsePositions[i] += 1; - if (horsePositions[i] === 3) { - const winnings = []; - - const profit = { - 1: 3.5, - 2: 3, - 3: 2.5, - 4: 2, - 5: 1.5, - }; - - // const profit = Math.floor((((8.9 / 9) * (6 - thisGame.horseSpeeds[i])) + 1.1) * 10) / 10; - - for (let j = 0; j < Object.keys(thisGame.bets).length; j++) { - if (Object.values(thisGame.bets)[j].horse === i + 1) { - winnings.push([Object.keys(thisGame.bets)[j], Object.values(thisGame.bets)[j].amount * profit[thisGame.horseSpeeds[i]]]); - } - } - - if (winnings.length === 0) { - for (let j = 0; j < Object.keys(thisGame.bets).length; j++) { - if (Object.values(thisGame.bets)[j].horse !== i + 1) { - const memberData = await this.client.findOrCreateMember({ - id: Object.keys(thisGame.bets)[j], - guildID: message.guild.id - }); - - const info = { - user: message.translate("economy/transactions:HORSERACE"), - amount: Object.values(thisGame.bets)[j].amount, - date: Date.now(), - type: "send" - }; - - memberData.transactions.push(info); - memberData.money -= Object.values(thisGame.bets)[j].amount; - } - } - - message.sendT("economy/horserace:NO_WINNERS", { - horse: i + 1 - }); - } else { - let winners = ""; - for (let j = 0; j < winnings.length; j++) { - winners += `\n<@${winnings[j][0]}> выиграл **${Math.floor(winnings[j][1])}** ${message.getNoun(Math.floor(winnings[j][1]), message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}!`; - - const memberData = await this.client.findOrCreateMember({ - id: winnings[j][0], - guildID: message.guild.id - }); - - const toAdd = Math.floor(winnings[j][1]) - Object.values(thisGame.bets)[j].amount; - - const info = { - user: message.translate("economy/transactions:HORSERACE"), - amount: toAdd, - date: Date.now(), - type: "got" - }; - - memberData.transactions.push(info); - memberData.money += toAdd; - memberData.save(); - } - - message.sendT("economy/horserace:WINNERS", { - horse: i + 1, - winners - }); - } - - delete games[message.channel.id]; - return; - } - } - } - } - } - } -} - -module.exports = Horserace; \ No newline at end of file diff --git a/commands/Economy/leaderboard.js b/commands/Economy/leaderboard.js deleted file mode 100644 index 984e5c46..00000000 --- a/commands/Economy/leaderboard.js +++ /dev/null @@ -1,174 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Leaderboard extends Command { - constructor(client) { - super(client, { - name: "leaderboard", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["lb"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const isOnlyOnMobile = (message.member.presence.clientStatus ? JSON.stringify(Object.keys(message.member.presence.clientStatus)) === JSON.stringify(["mobile"]) : false); - - const type = args[0]; - if (!type || !["credits", "level", "rep"].includes(type)) return message.error("economy/leaderboard:MISSING_TYPE"); - - if (type === "credits") { - const members = await this.client.membersData.find({ - guildID: message.guild.id - }).lean(), - membersLeaderboard = members.map((m) => { - return { - id: m.id, - money: m.money + m.bankSold - }; - }).sort((a, b) => b.money - a.money); - if (membersLeaderboard.length > 20) membersLeaderboard.length = 20; - - let userNames = ""; - let money = ""; - for (let i = 0; i < membersLeaderboard.length; i++) { - const data = membersLeaderboard[i]; - const user = (await this.client.users.fetch(data.id)).tag; - - userNames += `**${i + 1}**. ${user}\n`; - money += `${data.money}\n`; - } - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/leaderboard:TABLE", { - name: message.guild.name - }), - iconURL: message.guild.iconURL({ - dynamic: true - }) - }) - .setColor(data.config.embed.color) - .addFields({ - name: message.translate("economy/leaderboard:TOP"), - value: userNames, - inline: true - }, { - name: message.translate("economy/leaderboard:CREDITS"), - value: money, - inline: true - }); - - message.reply({ - embeds: [embed] - }); - } else if (type === "level") { - const members = await this.client.membersData.find({ - guildID: message.guild.id - }).lean(), - membersLeaderboard = members.map((m) => { - return { - id: m.id, - level: m.level, - xp: m.exp - }; - }).sort((a, b) => b.level - a.level); - if (membersLeaderboard.length > 20) membersLeaderboard.length = 20; - - let userNames = ""; - let level = ""; - let xp = ""; - for (let i = 0; i < membersLeaderboard.length; i++) { - const data = membersLeaderboard[i]; - const user = (await this.client.users.fetch(data.id)).tag; - - userNames += `**${i + 1}**. ${user}\n`; - level += `${data.level}\n`; - xp += `${data.xp} / ${5 * (data.level * data.level) + 80 * data.level + 100}\n`; - } - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/leaderboard:TABLE", { - name: message.guild.name - }), - iconURL: message.guild.iconURL({ - dynamic: true - }) - }) - .setColor(data.config.embed.color) - .addFields({ - name: message.translate("economy/leaderboard:TOP"), - value: userNames, - inline: true - }, { - name: message.translate("economy/leaderboard:LEVEL"), - value: level, - inline: true - }, { - name: message.translate("economy/leaderboard:XP"), - value: xp, - inline: true - }); - - message.reply({ - embeds: [embed] - }); - } else if (type === "rep") { - const users = await this.client.usersData.find({ - rep: { $gt: 0 } - }).lean(), - usersLeaderboard = users.map((u) => { - return { - id: u.id, - rep: u.rep - }; - }).sort((a, b) => b.rep - a.rep); - if (usersLeaderboard.length > 20) usersLeaderboard.length = 20; - - let userNames = ""; - let rep = ""; - for (let i = 0; i < usersLeaderboard.length; i++) { - const data = usersLeaderboard[i]; - const user = (await this.client.users.fetch(data.id)).tag; - - userNames += `**${i + 1}**. ${user}\n`; - rep += `${data.rep}\n`; - } - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/leaderboard:TABLE", { - name: message.guild.name - }), - iconURL: message.guild.iconURL({ - dynamic: true - }) - }) - .setColor(data.config.embed.color) - .addFields({ - name: message.translate("economy/leaderboard:TOP"), - value: userNames, - inline: true - }, { - name: message.translate("economy/leaderboard:REP"), - value: rep, - inline: true - }); - - message.reply({ - embeds: [embed] - }); - } - - if (isOnlyOnMobile) message.sendT("economy/leaderboard:MOBILE"); - } -} - -module.exports = Leaderboard; \ No newline at end of file diff --git a/commands/Economy/marry.js b/commands/Economy/marry.js deleted file mode 100644 index 2ad02c54..00000000 --- a/commands/Economy/marry.js +++ /dev/null @@ -1,134 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const pendings = {}; - -class Marry extends Command { - constructor(client) { - super(client, { - name: "marry", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (data.userData.lover) return message.error("economy/marry:ALREADY_MARRIED", { prefix: data.guild.prefix }); - - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("economy/marry:INVALID_MEMBER"); - - const userData = await this.client.findOrCreateUser({ - id: member.id - }); - - if (userData.lover) return message.error("economy/marry:ALREADY_MARRIED_USER", { username: member.user.tag }); - if (member.user.bot) return message.error("economy/marry:BOT_USER"); - if (member.id === message.author.id) return message.error("economy/marry:YOURSELF"); - - for (const requester in pendings) { - const receiver = pendings[requester]; - // If the member already sent a request to someone - if (requester === message.author.id) { - const user = this.client.users.cache.get(receiver) || await this.client.users.fetch(receiver); - return message.error("economy/marry:REQUEST_AUTHOR_TO_AMEMBER", { - username: user.tag - }); - } else if (receiver === message.author.id) { // If there is a pending request for this member - const user = this.client.users.cache.get(requester) || await this.client.users.fetch(requester); - return message.error("economy/marry:REQUEST_AMEMBER_TO_AUTHOR", { - username: user.tag - }); - } else if (requester === member.id) { // If the asked member has sent pending request - const user = this.client.users.cache.get(receiver) || await this.client.users.fetch(receiver); - return message.error("economy/marry:REQUEST_AMEMBER_TO_MEMBER", { - firstUsername: member.user.tag, - secondUsername: user.tag - }); - } else if (receiver === member.id) { // If there is a pending request for the asked member - const user = this.client.users.cache.get(requester) || await this.client.users.fetch(requester); - return message.error("economy/marry:REQUEST_MEMBER_TO_AMEMBER", { - firstUsername: member.user.tag, - secondUsername: user.tag - }); - } - } - - // Update pending requests - pendings[message.author.id] = member.id; - - message.sendT("economy/marry:REQUEST", { - from: message.author.toString(), - to: member.user.toString() - }); - - const filter = m => m.author.id === member.id; - const collector = new Discord.MessageCollector(message.channel, { - filter, - time: 120000 - }); - - collector.on("collect", (msg) => { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - return collector.stop(true); - } else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { - return collector.stop(false); - } else { - return message.error("misc:INVALID_YES_NO"); - } - }); - - collector.on("end", async (_collected, reason) => { - // Delete pending request - delete pendings[message.author.id]; - if (reason === "time") return message.error("economy/marry:TIMEOUT", { username: member.user.toString() }); - if (reason) { - data.userData.lover = member.id; - await data.userData.save(); - userData.lover = message.author.id; - await userData.save(); - const messageOptions = { - content: `${member.toString()} :heart: ${message.author.toString()}`, - files: [{ - name: "achievement_unlocked3.png", - attachment: "./assets/img/achievements/achievement_unlocked3.png" - }] - }; - let sent = false; - if (!userData.achievements.married.achieved) { - message.channel.send(messageOptions); - sent = true; - userData.achievements.married.achieved = true; - userData.achievements.married.progress.now = 1; - userData.markModified("achievements.married"); - userData.save(); - } - if (!data.userData.achievements.married.achieved) { - if (!sent) message.channel.send(messageOptions); - data.userData.achievements.married.achieved = true; - data.userData.achievements.married.progress.now = 1; - data.userData.markModified("achievements.married"); - data.userData.save(); - } - return message.success("economy/marry:SUCCESS", { - creator: message.author.toString(), - partner: member.user.toString() - }); - } else { - return message.success("economy/marry:DENIED", { - creator: message.author.toString(), - partner: member.user.toString() - }); - } - }); - } -} - -module.exports = Marry; \ No newline at end of file diff --git a/commands/Economy/money.js b/commands/Economy/money.js deleted file mode 100644 index d173f229..00000000 --- a/commands/Economy/money.js +++ /dev/null @@ -1,75 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const asyncForEach = async (collection, callback) => { - const allPromises = collection.map(async key => { - await callback(key); - }); - - return await Promise.all(allPromises); -}; - -class Money extends Command { - constructor(client) { - super(client, { - name: "money", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["balance", "mon"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let member = await this.client.resolveMember(args[0], message.guild); - if (!member) member = message.member; - const user = member.user; - - if (user.bot) return message.error("misc:BOT_USER"); - - const memberData = (message.author === user) ? data.memberData : await this.client.findOrCreateMember({ - id: user.id, - guildID: message.guild.id - }); - - const commonsGuilds = this.client.guilds.cache.filter((g) => g.members.cache.get(user.id)); - let globalMoney = 0; - await asyncForEach(commonsGuilds, async (guild) => { - const data = await this.client.findOrCreateMember({ - id: user.id, - guildID: guild.id - }); - globalMoney += data.money; - globalMoney += data.bankSold; - }); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/money:TITLE", { - username: member.user.username - }), - iconURL: member.user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Money; \ No newline at end of file diff --git a/commands/Economy/number.js b/commands/Economy/number.js deleted file mode 100644 index d070ef4c..00000000 --- a/commands/Economy/number.js +++ /dev/null @@ -1,98 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const currentGames = {}; - -class Number extends Command { - constructor(client) { - super(client, { - name: "number", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["num"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (currentGames[message.guild.id]) return message.error("economy/number:GAME_RUNNING"); - - const participants = [], - number = this.client.functions.randomNum(1000, 6000); - - await message.sendT("economy/number:GAME_START"); - - // Store the date wich the game has started - const gameCreatedAt = Date.now(); - - const filter = m => !m.author.bot; - const collector = new Discord.MessageCollector(message.channel, { - filter, - time: 480000 // 8 minutes - }); - currentGames[message.guild.id] = true; - - collector.on("collect", async msg => { - if (this.client.functions.getPrefix(msg, data)) return; - if (!participants.includes(msg.author.id)) participants.push(msg.author.id); - if (msg.content === "STOP") return collector.stop("force"); - if (isNaN(msg.content)) return; - - const parsedNumber = parseInt(msg.content, 10); - - if (parsedNumber === number) { - const time = this.client.functions.convertTime(message.guild, Date.now() - gameCreatedAt); - message.sendT("economy/number:GAME_STATS", { - winner: msg.author.toString(), - number, - time, - participantCount: participants.length, - participants: participants.map(p => `<@${p}>`).join(", ") - }); - - if (participants.length > 1 && data.guild.disabledCategories && !data.guild.disabledCategories.includes("Economy")) { - const won = 100 * (participants.length * 0.5); - - message.sendT("economy/number:WON", { - winner: msg.author.username, - credits: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - }); - - const memberData = await this.client.findOrCreateMember({ - id: msg.author.id, - guildID: message.guild.id - }); - - const info = { - user: message.translate("economy/transactions:NUMBERS"), - amount: won, - date: Date.now(), - type: "got" - }; - - data.memberData.transactions.push(info); - - memberData.money += won; - memberData.save(); - } - - collector.stop(); - } - if (parseInt(msg.content) < number) message.error("economy/number:BIG", { user: msg.author.toString(), number: parsedNumber }); - if (parseInt(msg.content) > number) message.error("economy/number:SMALL", { user: msg.author.toString(), number: parsedNumber }); - }); - - collector.on("end", (_collected, reason) => { - delete currentGames[message.guild.id]; - if (reason === "time") return message.error("economy/number:DEFEAT", { number }); - else if (reason === "force") return message.error("misc:FORCE_STOP", { user: message.author.toString() }); - }); - } -} - -module.exports = Number; \ No newline at end of file diff --git a/commands/Economy/pay.js b/commands/Economy/pay.js deleted file mode 100644 index 0afd9c9c..00000000 --- a/commands/Economy/pay.js +++ /dev/null @@ -1,59 +0,0 @@ -const Command = require("../../base/Command"); - -class Pay extends Command { - constructor(client) { - super(client, { - name: "pay", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("economy/pay:INVALID_MEMBER"); - if (member.user.bot) return message.error("economy/pay:BOT_USER"); - if (member.id === message.author.id) return message.error("economy/pay:YOURSELF"); - - const sentAmount = args[1]; - if (!sentAmount || isNaN(sentAmount) || parseInt(sentAmount, 10) <= 0) return message.error("economy/pay:INVALID_AMOUNT"); - - const amount = Math.ceil(parseInt(sentAmount, 10)); - if (amount > data.memberData.money) return message.error("economy/pay:ENOUGH_MONEY", { - amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}` - }); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - const info = { - user: member.user.tag, - amount: parseInt(amount, 10), - date: Date.now(), - type: "send" - }; - - data.memberData.transactions.push(info); - data.memberData.money = data.memberData.money - parseInt(amount, 10); - data.memberData.save(); - - memberData.money = memberData.money + parseInt(amount, 10); - memberData.save(); - - message.success("economy/pay:SUCCESS", { - amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - username: member.user.tag - }); - } -} - -module.exports = Pay; \ No newline at end of file diff --git a/commands/Economy/profile.js b/commands/Economy/profile.js deleted file mode 100644 index d7c9685e..00000000 --- a/commands/Economy/profile.js +++ /dev/null @@ -1,98 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const asyncForEach = async (collection, callback) => { - const allPromises = collection.map(async key => { - await callback(key); - }); - - return await Promise.all(allPromises); -}; - -class Profile extends Command { - constructor(client) { - super(client, { - name: "profile", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["prof"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const arg = args[0] || message.author; - let member = await this.client.resolveMember(arg, message.guild); - if (!member) member = message.member; - if (member.user.bot) return message.error("economy/profile:BOT_USER"); - - const memberData = (member.id === message.author.id ? data.memberData : await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - })); - const userData = (member.id === message.author.id ? data.userData : await this.client.findOrCreateUser({ - id: member.id - })); - if (userData.lover && !this.client.users.cache.get(userData.lover)) await this.client.users.fetch(userData.lover, true); - - const commonsGuilds = this.client.guilds.cache.filter((g) => g.members.cache.get(member.id)); - let globalMoney = 0; - await asyncForEach(commonsGuilds, async (guild) => { - const data = await this.client.findOrCreateMember({ - id: member.id, - guildID: guild.id - }); - globalMoney += data.money; - globalMoney += data.bankSold; - }); - - const profileEmbed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/profile:TITLE", { - username: member.user.tag - }), - iconURL: member.user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setImage("attachment://achievements.png") - .addField(this.client.customEmojis.link + " " + message.translate("economy/profile:LINK"), `[${message.translate("economy/profile:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/user/${member.user.id}/${message.guild.id})`) - .addField(message.translate("economy/profile:BIO"), userData.bio ? userData.bio : message.translate("economy/profile:NO_BIO")) - .addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:REPUTATION"), `**${userData.rep}** ${message.getNoun(userData.rep, message.translate("misc:NOUNS:POINTS:1"), message.translate("misc:NOUNS:POINTS:2"), message.translate("misc:NOUNS:POINTS:5"))}`, true) - .addField(message.translate("economy/profile:LEVEL"), `**${memberData.level}**`, true) - .addField(message.translate("economy/profile:EXP"), `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`, true) - .addField(message.translate("economy/profile:REGISTERED"), message.printDate(new Date(memberData.registeredAt)), true) - .addField(message.translate("economy/profile:BIRTHDATE"), (!userData.birthdate ? message.translate("economy/profile:NO_BIRTHDATE") : message.printDate(new Date(userData.birthdate))), true) - .addField(message.translate("economy/profile:LOVER"), (!userData.lover ? message.translate("economy/profile:NO_LOVER") : this.client.users.cache.get(userData.lover).tag), true) - .addField(message.translate("economy/profile:ACHIEVEMENTS"), message.translate("economy/profile:ACHIEVEMENTS_CONTENT", { - prefix: data.guild.prefix - })) - .setColor(data.config.embed.color) // Sets the color of the embed - .setFooter({ - text: data.config.embed.footer - }) // Sets the footer of the embed - .setTimestamp(); - - const buffer = await userData.getAchievements(); - - message.reply({ - embeds: [profileEmbed], - files: [{ - name: "achievements.png", - attachment: buffer - }] - }); - } -} - -module.exports = Profile; \ No newline at end of file diff --git a/commands/Economy/rep.js b/commands/Economy/rep.js deleted file mode 100644 index ec625427..00000000 --- a/commands/Economy/rep.js +++ /dev/null @@ -1,71 +0,0 @@ -const Command = require("../../base/Command"); - -class Rep extends Command { - constructor(client) { - super(client, { - name: "rep", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["reputation"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - // if the member is already in the cooldown db - const isInCooldown = (data.userData.cooldowns || { - rep: 0 - }).rep; - if (isInCooldown) { - /*if the timestamp recorded in the database indicating - when the member will be able to execute the order again - is greater than the current date, display an error message */ - if (isInCooldown > Date.now()) return message.error("economy/rep:COOLDOWN", { - time: message.convertTime(isInCooldown, "to", true) - }); - } - - const user = await this.client.resolveUser(args[0]); - if (!user) return message.error("economy/rep:INVALID_USER"); - if (user.bot) return message.error("economy/rep:BOT_USER"); - if (user.id === message.author.id) return message.error("economy/rep:YOURSELF"); - - // Records in the database the time when the member will be able to execute the command again (in 12 hours) - const toWait = Date.now() + 21600000; - data.userData.cooldowns = {}; - data.userData.cooldowns.rep = toWait; - data.userData.markModified("cooldowns"); - data.userData.save(); - - const userData = await this.client.findOrCreateUser({ - id: user.id - }); - userData.rep++; - if (!userData.achievements.rep.achieved) { - userData.achievements.rep.progress.now = (userData.rep > userData.achievements.rep.progress.total ? userData.achievements.rep.progress.total : userData.rep); - if (userData.achievements.rep.progress.now >= userData.achievements.rep.progress.total) { - userData.achievements.rep.achieved = true; - message.channel.send({ - content: `${user}`, - files: [{ - name: "achievement_unlocked6.png", - attachment: "./assets/img/achievements/achievement_unlocked6.png" - }] - }); - } - userData.markModified("achievements.rep"); - } - await userData.save(); - - message.success("economy/rep:SUCCESS", { - username: user.username - }); - } -} - -module.exports = Rep; \ No newline at end of file diff --git a/commands/Economy/rob.js b/commands/Economy/rob.js deleted file mode 100644 index ea682ba1..00000000 --- a/commands/Economy/rob.js +++ /dev/null @@ -1,78 +0,0 @@ -const Command = require("../../base/Command"); - -class Rob extends Command { - constructor(client) { - super(client, { - name: "rob", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["steal"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("economy/rob:MISSING_MEMBER"); - if (member.id === message.author.id) return message.error("economy/rob:YOURSELF"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - const isInCooldown = memberData.cooldowns.rob || 0; - if (isInCooldown) { - if (isInCooldown > Date.now()) return message.error("economy/rob:COOLDOWN", { user: member.user }); - } - - let amountToRob = args[1]; - if (!amountToRob || isNaN(amountToRob) || parseInt(amountToRob, 10) <= 0) return message.error("economy/rob:MISSING_AMOUNT", { user: member.user }); - - amountToRob = Math.floor(parseInt(amountToRob, 10)); - - if (amountToRob > memberData.money) return message.error("economy/rob:NOT_ENOUGH_MEMBER", { user: member.user }); - - const potentiallyLose = Math.floor(amountToRob * 1.5); - if (potentiallyLose > data.memberData.money) return message.error("economy/rob:NOT_ENOUGH_AUTHOR", { - moneyMin: `${potentiallyLose} ${message.getNoun(potentiallyLose, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - moneyCurrent: `${data.memberData.money} ${message.getNoun(data.memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - }); - - const itsAWon = Math.floor(this.client.functions.randomNum(0, 100) < 25); - - if (itsAWon) { - const toWait = Date.now() + 6 * (60 * 60000); // 6 hours - memberData.cooldowns.rob = toWait; - memberData.markModified("cooldowns"); - await memberData.save(); - const randomNum = this.client.functions.randomNum(1, 2); - message.sendT("economy/rob:ROB_WON_" + randomNum, { - money: `${amountToRob} ${message.getNoun(amountToRob, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - user: member.user - }); - data.memberData.money += amountToRob; - memberData.money -= amountToRob, 10; - memberData.save(); - data.memberData.save(); - } else { - const won = Math.floor(0.9 * amountToRob); - const randomNum = this.client.functions.randomNum(1, 2); - message.sendT("economy/rob:ROB_LOSE_" + randomNum, { - fine: `${potentiallyLose} ${message.getNoun(potentiallyLose, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - offset: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - user: member.user - }); - data.memberData.money -= potentiallyLose; - memberData.money += won; - memberData.save(); - data.memberData.save(); - } - } -} - -module.exports = Rob; \ No newline at end of file diff --git a/commands/Economy/setbio.js b/commands/Economy/setbio.js deleted file mode 100644 index d3e8998e..00000000 --- a/commands/Economy/setbio.js +++ /dev/null @@ -1,30 +0,0 @@ -const Command = require("../../base/Command"); - -class Setbio extends Command { - constructor(client) { - super(client, { - name: "setbio", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["biography", "setdesc", "sb"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const newBio = args.join(" "); - if (!newBio) return message.error("economy/setbio:MISSING"); - if (newBio.length > 100) return message.error("economy/setbio:MAX_CHARACT"); - - data.userData.bio = newBio; - message.success("economy/setbio:SUCCESS"); - await data.userData.save(); - } -} - -module.exports = Setbio; \ No newline at end of file diff --git a/commands/Economy/slots.js b/commands/Economy/slots.js deleted file mode 100644 index 31fe1e4c..00000000 --- a/commands/Economy/slots.js +++ /dev/null @@ -1,208 +0,0 @@ -const Command = require("../../base/Command"); - -class Slots extends Command { - constructor(client) { - super(client, { - name: "slots", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["casino", "slot"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const fruits = ["🍎", "🍐", "🍌", "🍇", "🍉", "🍒", "🍓"]; - - let i1 = 0, j1 = 0, k1 = 0, - i2 = 1, j2 = 1, k2 = 1, - i3 = 2, j3 = 2, k3 = 2; - - // Gets three random fruits array - const colonnes = [ - this.client.functions.shuffle(fruits), - this.client.functions.shuffle(fruits), - this.client.functions.shuffle(fruits) - ]; - - // Gets the amount provided - let amount = args[0]; - if (!amount || isNaN(amount) || amount < 1) amount = 50; - if (amount > data.memberData.money) return message.error("economy/slots:NOT_ENOUGH", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` }); - - amount = Math.round(amount); - - function getCredits(number, isJackpot) { - if (!isJackpot) number = number * 1.5; - else if (isJackpot) number = number * 5; - - return Math.round(number); - } - - const tmsg = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - editMsg(); - - const interval = setInterval(editMsg, 1000); - - setTimeout(() => { - clearInterval(interval); - end(tmsg); - }, 4000); - - async function end() { - let msg = "[ :slot_machine: | **СЛОТЫ** ]\n------------------\n"; - - i1 = (i1 < fruits.length - 1) ? i1 + 1 : 0; - i2 = (i2 < fruits.length - 1) ? i2 + 1 : 0; - i3 = (i3 < fruits.length - 1) ? i3 + 1 : 0; - j1 = (j1 < fruits.length - 1) ? j1 + 1 : 0; - j2 = (j2 < fruits.length - 1) ? j2 + 1 : 0; - j3 = (j3 < fruits.length - 1) ? j3 + 1 : 0; - k1 = (k1 < fruits.length - 1) ? k1 + 1 : 0; - k2 = (k2 < fruits.length - 1) ? k2 + 1 : 0; - k3 = (k3 < fruits.length - 1) ? k3 + 1 : 0; - - msg += colonnes[0][i1] + " : " + colonnes[1][j1] + " : " + colonnes[2][k1] + "\n"; - msg += colonnes[0][i2] + " : " + colonnes[1][j2] + " : " + colonnes[2][k2] + " **<**\n"; - msg += colonnes[0][i3] + " : " + colonnes[1][j3] + " : " + colonnes[2][k3] + "\n------------------\n"; - - if ((colonnes[0][i2] == colonnes[1][j2]) && (colonnes[1][j2] == colonnes[2][k2])) { - msg += "| : : : **" + (message.translate("common:VICTORY").toUpperCase()) + "** : : : |"; - tmsg.edit(msg); - const credits = getCredits(amount, true); - message.channel.send({ - content: "**!! ДЖЕКПОТ !!**\n" + message.translate("economy/slots:VICTORY", { - money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - won: `**${credits}** ${message.getNoun(credits, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - username: message.author.username - }) - }); - - const toAdd = credits - amount; - - const info = { - user: message.translate("economy/slots:DESCRIPTION"), - amount: toAdd, - date: Date.now(), - type: "got" - }; - - data.memberData.transactions.push(info); - - data.memberData.money = data.memberData.money + toAdd; - if (!data.userData.achievements.slots.achieved) { - data.userData.achievements.slots.progress.now += 1; - if (data.userData.achievements.slots.progress.now === data.userData.achievements.slots.progress.total) { - data.userData.achievements.slots.achieved = true; - message.reply({ - files: [{ - name: "achievement_unlocked4.png", - attachment: "./assets/img/achievements/achievement_unlocked4.png" - }] - }); - } - data.userData.markModified("achievements.slots"); - await data.userData.save(); - } - await data.memberData.save(); - return; - } - - if (colonnes[0][i2] == colonnes[1][j2] || colonnes[1][j2] == colonnes[2][k2] || colonnes[0][i2] == colonnes[2][k2]) { - msg += "| : : : **" + (message.translate("common:VICTORY").toUpperCase()) + "** : : : |"; - tmsg.edit(msg); - const credits = getCredits(amount, false); - message.channel.send({ - content: message.translate("economy/slots:VICTORY", { - money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - won: `**${credits}** ${message.getNoun(credits, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - username: message.author.username - }) - }); - const toAdd = credits - amount; - - const info = { - user: message.translate("economy/slots:DESCRIPTION"), - amount: toAdd, - date: Date.now(), - type: "got" - }; - - data.memberData.transactions.push(info); - - data.memberData.money = data.memberData.money + toAdd; - if (!data.userData.achievements.slots.achieved) { - data.userData.achievements.slots.progress.now += 1; - if (data.userData.achievements.slots.progress.now === data.userData.achievements.slots.progress.total) { - data.userData.achievements.slots.achieved = true; - message.reply({ - files: [{ - name: "achievement_unlocked4.png", - attachment: "./assets/img/achievements/achievement_unlocked4.png" - }] - }); - } - data.userData.markModified("achievements.slots"); - await data.userData.save(); - } - await data.memberData.save(); - return; - } - - msg += "| : : : **" + (message.translate("common:DEFEAT").toUpperCase()) + "** : : : |"; - message.channel.send({ - content: message.translate("economy/slots:DEFEAT", { - money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, - username: message.author.username - }) - }); - - const info = { - user: message.translate("economy/slots:DESCRIPTION"), - amount: amount, - date: Date.now(), - type: "send" - }; - - data.memberData.transactions.push(info); - - data.memberData.money = data.memberData.money - amount; - if (!data.userData.achievements.slots.achieved) { - data.userData.achievements.slots.progress.now = 0; - data.userData.markModified("achievements.slots"); - await data.userData.save(); - } - await data.memberData.save(); - return; - } - - function editMsg() { - let msg = "[ :slot_machine: | **СЛОТЫ** ]\n------------------\n"; - - i1 = (i1 < fruits.length - 1) ? i1 + 1 : 0; - i2 = (i2 < fruits.length - 1) ? i2 + 1 : 0; - i3 = (i3 < fruits.length - 1) ? i3 + 1 : 0; - j1 = (j1 < fruits.length - 1) ? j1 + 1 : 0; - j2 = (j2 < fruits.length - 1) ? j2 + 1 : 0; - j3 = (j3 < fruits.length - 1) ? j3 + 1 : 0; - k1 = (k1 < fruits.length - 1) ? k1 + 1 : 0; - k2 = (k2 < fruits.length - 1) ? k2 + 1 : 0; - k3 = (k3 < fruits.length - 1) ? k3 + 1 : 0; - - msg += colonnes[0][i1] + " : " + colonnes[1][j1] + " : " + colonnes[2][k1] + "\n"; - msg += colonnes[0][i2] + " : " + colonnes[1][j2] + " : " + colonnes[2][k2] + " **<**\n"; - msg += colonnes[0][i3] + " : " + colonnes[1][j3] + " : " + colonnes[2][k3] + "\n"; - - tmsg.edit(msg); - } - } -} - -module.exports = Slots; \ No newline at end of file diff --git a/commands/Economy/tictactoe.js b/commands/Economy/tictactoe.js deleted file mode 100644 index e011cdd9..00000000 --- a/commands/Economy/tictactoe.js +++ /dev/null @@ -1,46 +0,0 @@ -const Command = require("../../base/Command"), - tictactoe = require("../../helpers/tictactoe"); - -class TicTacToe extends Command { - constructor(client) { - super(client, { - name: "tictactoe", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ttt"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - tictactoe(message, { - resultBtn: true, - embedColor: data.config.embed.color, - embedFoot: data.config.embed.footer - }).then(async winner => { - const memberData = await this.client.findOrCreateMember({ - id: winner.id, - guildID: message.guild.id - }); - - const info = { - user: message.translate("economy/transactions:TTT"), - amount: 100, - date: Date.now(), - type: "got" - }; - - memberData.transactions.push(info); - - memberData.money += 100; - memberData.save(); - }); - } -} - -module.exports = TicTacToe; \ No newline at end of file diff --git a/commands/Economy/transactions.js b/commands/Economy/transactions.js deleted file mode 100644 index 646ccd6c..00000000 --- a/commands/Economy/transactions.js +++ /dev/null @@ -1,56 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Transactions extends Command { - constructor(client) { - super(client, { - name: "transactions", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["tr"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("economy/transactions:EMBED_TRANSACTIONS"), - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const transactions = data.memberData.transactions, - sortedTransactions = [ [], [] ]; - - transactions.slice(-20).forEach((t) => { - const array = t.type === "got" ? sortedTransactions[0] : sortedTransactions[1]; - array.push(`${message.translate("economy/transactions:T_USER_" + t.type.toUpperCase())}: ${t.user}\n${message.translate("economy/transactions:T_AMOUNT")}: ${t.amount}\n${message.translate("economy/transactions:T_DATE")}: ${message.printDate(t.date, "Do MMMM YYYY, HH:mm")}\n`); - }); - - if (transactions.length < 1) { - embed.setDescription(message.translate("economy/transactions:NO_TRANSACTIONS")); - } else { - if (sortedTransactions[0].length > 0) embed.addField(message.translate("economy/transactions:T_GOT"), sortedTransactions[0].join("\n"), true); - if (sortedTransactions[1].length > 0) embed.addField(message.translate("economy/transactions:T_SEND"), sortedTransactions[1].join("\n"), true); - } - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Transactions; \ No newline at end of file diff --git a/commands/Economy/withdraw.js b/commands/Economy/withdraw.js deleted file mode 100644 index f19dc6ad..00000000 --- a/commands/Economy/withdraw.js +++ /dev/null @@ -1,52 +0,0 @@ -const Command = require("../../base/Command"); - -class Withdraw extends Command { - constructor(client) { - super(client, { - name: "withdraw", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["wd"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let amount = args[0]; - - if (!(parseInt(data.memberData.bankSold, 10) > 0)) return message.error("economy/withdraw:NO_CREDIT"); - - if (args[0] === "all") { - amount = parseInt(data.memberData.bankSold, 10); - } else { - if (isNaN(amount) || parseInt(amount, 10) < 1) return message.error("economy/withdraw:MISSING_AMOUNT"); - amount = parseInt(amount, 10); - } - - if (data.memberData.bankSold < amount) return message.error("economy/withdraw:NOT_ENOUGH", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` }); - - const info = { - user: message.translate("economy/transactions:BANK"), - amount: amount, - date: Date.now(), - type: "got" - }; - - data.memberData.transactions.push(info); - - data.memberData.money = data.memberData.money + amount; - data.memberData.bankSold = data.memberData.bankSold - amount; - data.memberData.save(); - - message.success("economy/withdraw:SUCCESS", { - money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - }); - } -} - -module.exports = Withdraw; \ No newline at end of file diff --git a/commands/Economy/work.js b/commands/Economy/work.js deleted file mode 100644 index 7127855e..00000000 --- a/commands/Economy/work.js +++ /dev/null @@ -1,114 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Work extends Command { - constructor(client) { - super(client, { - name: "work", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["salary", "daily"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - // if the member is already in the cooldown db - const isInCooldown = data.memberData.cooldowns.work; - if (isInCooldown) { - /*if the timestamp recorded in the database indicating - when the member will be able to execute the order again - is greater than the current date, display an error message */ - if (isInCooldown > Date.now()) return message.error("economy/work:COOLDOWN", { - time: message.convertTime(isInCooldown, "to", true) - }); - } - - if (Date.now() > data.memberData.cooldowns.work + (24 * 3600000)) data.memberData.workStreak = 0; - - // Records in the database the time when the member will be able to execute the command again (in 12 hours) - const toWait = Date.now() + 43200000; - data.memberData.cooldowns.work = toWait; - data.memberData.markModified("cooldowns"); - - data.memberData.workStreak = (data.memberData.workStreak || 0) + 1; - await data.memberData.save(); - - const embed = new Discord.MessageEmbed() - .setFooter({ - text: message.translate("economy/work:AWARD"), - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setColor(data.config.embed.color); - - const award = [ - this.client.customEmojis.letters.a, - this.client.customEmojis.letters.w, - this.client.customEmojis.letters.a, - this.client.customEmojis.letters.r, - this.client.customEmojis.letters.d - ]; - let won = 200; - - if (data.memberData.workStreak >= 5) { - won += 200; - embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", { - won: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - })) - .addField(message.translate("economy/work:STREAK"), message.translate("economy/work:STREAK_CONTENT")); - data.memberData.workStreak = 0; - } else { - for (let i = 0; i < award.length; i++) { - if (data.memberData.workStreak > i) { - const letter = Discord.Util.parseEmoji(award[i]).name.split("_")[1]; - award[i] = `:regional_indicator_${letter.toLowerCase()}:`; - } - } - embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", { - won: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - })) - .addField(message.translate("economy/work:STREAK"), award.join("")); - } - - const info = { - user: message.translate("economy/work:SALARY"), - amount: won, - date: Date.now(), - type: "got" - }; - - data.memberData.transactions.push(info); - data.memberData.money = data.memberData.money + won; - data.memberData.save(); - - const messageOptions = { - embeds: [embed] - }; - if (!data.userData.achievements.work.achieved) { - data.userData.achievements.work.progress.now += 1; - if (data.userData.achievements.work.progress.now === data.userData.achievements.work.progress.total) { - messageOptions.files = [{ - name: "unlocked.png", - attachment: "./assets/img/achievements/achievement_unlocked1.png" - }]; - data.userData.achievements.work.achieved = true; - } - data.userData.markModified("achievements.work"); - data.userData.save(); - } - - // Send the embed in the current channel - message.reply(messageOptions); - } -} - -module.exports = Work; \ No newline at end of file diff --git a/commands/Fun/8ball.js b/commands/Fun/8ball.js deleted file mode 100644 index e0ab1bc7..00000000 --- a/commands/Fun/8ball.js +++ /dev/null @@ -1,31 +0,0 @@ -const Command = require("../../base/Command"); - -class Eightball extends Command { - constructor(client) { - super(client, { - name: "8ball", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["8b"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - if (!args[0] || !message.content.endsWith("?")) return message.error("fun/8ball:ERR_QUESTION"); - - const answerN = this.client.functions.randomNum(1, 20); - const answer = message.translate(`fun/8ball:RESPONSE_${answerN}`); - - message.reply({ - content: answer - }); - } -} - -module.exports = Eightball; \ No newline at end of file diff --git a/commands/Fun/ascii.js b/commands/Fun/ascii.js deleted file mode 100644 index ae70522b..00000000 --- a/commands/Fun/ascii.js +++ /dev/null @@ -1,34 +0,0 @@ -const Command = require("../../base/Command"), - figlet = require("figlet"), - util = require("util"), - figletAsync = util.promisify(figlet); - -class Ascii extends Command { - constructor(client) { - super(client, { - name: "ascii", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - const text = args.join(" "); - if (!text || text.length > 20) return message.error("fun/ascii:TEXT_MISSING"); - - const rendered = await figletAsync(text); - - message.reply({ - content: "```" + rendered + "```" - }); - } -} - -module.exports = Ascii; \ No newline at end of file diff --git a/commands/Fun/choice.js b/commands/Fun/choice.js deleted file mode 100644 index d81ff687..00000000 --- a/commands/Fun/choice.js +++ /dev/null @@ -1,36 +0,0 @@ -const Command = require("../../base/Command"); - -class Choice extends Command { - constructor(client) { - super(client, { - name: "choice", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["cho", "ra"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - // Gets the answers by spliting on "/" - const answers = args.join(" ").split("/"); - if (answers.length < 2) return message.error("fun/choice:MISSING"); - if (answers.some(answer => !answer)) return message.error("fun/choice:EMPTY"); - - const m = await message.sendT("fun/choice:PROGRESS", null, false, false, "loading"); - - setTimeout(() => { - const result = answers[parseInt(Math.floor(Math.random() * answers.length))]; - m.success("fun/choice:DONE", { result }, { - edit: true - }); - }, 1500); - } -} - -module.exports = Choice; \ No newline at end of file diff --git a/commands/Fun/flip.js b/commands/Fun/flip.js deleted file mode 100644 index 09944fe1..00000000 --- a/commands/Fun/flip.js +++ /dev/null @@ -1,25 +0,0 @@ -const Command = require("../../base/Command"); - -class Flip extends Command { - constructor(client) { - super(client, { - name: "flip", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["dice", "coin"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message) { - const isHeads = Math.random() > 0.5; - isHeads ? message.sendT("fun/flip:HEADS") : message.sendT("fun/flip:TAILS"); - } -} - -module.exports = Flip; \ No newline at end of file diff --git a/commands/Fun/lmg.js b/commands/Fun/lmg.js deleted file mode 100644 index 0742216b..00000000 --- a/commands/Fun/lmg.js +++ /dev/null @@ -1,30 +0,0 @@ -const Command = require("../../base/Command"); - -class Lmg extends Command { - constructor(client) { - super(client, { - name: "lmg", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["lmgtfy"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const question = args.join(" "); - if (!question) return message.error("fun/lmg:MISSING"); - const encodedQuestion = question.replace(/[' '_]/g, "+"); - await message.reply({ - content: `` - }); - message.delete().catch(() => {}); - } -} - -module.exports = Lmg; \ No newline at end of file diff --git a/commands/Fun/lovecalc.js b/commands/Fun/lovecalc.js deleted file mode 100644 index 102f4a9d..00000000 --- a/commands/Fun/lovecalc.js +++ /dev/null @@ -1,59 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - md5 = require("md5"); - -class Lovecalc extends Command { - constructor(client) { - super(client, { - name: "lovecalc", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["lc"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const firstMember = message.mentions.members.filter(m => m.id !== message.author.id).first(); - if (!firstMember) return message.error("fun/lovecalc:MISSING"); - const secondMember = message.mentions.members - .filter(m => m.id !== firstMember.id) - .filter(m => m.id !== message.author.id) - .first() || message.member; - if (!secondMember) return message.error("fun/lovecalc:MISSING"); - - const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10)); - const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`); - - const string = hash - .split("") - .filter(e => !isNaN(e)) - .join(""); - const percent = parseInt(string.substr(0, 2), 10); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: `❤️ ${message.translate("fun/lovecalc:DESCRIPTION")}` - }) - .setDescription(message.translate("fun/lovecalc:CONTENT", { - percent, - firstUsername: firstMember.user.username, - secondUsername: secondMember.user.username - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Lovecalc; \ No newline at end of file diff --git a/commands/Fun/memes.js b/commands/Fun/memes.js deleted file mode 100644 index 5026f94c..00000000 --- a/commands/Fun/memes.js +++ /dev/null @@ -1,78 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class Memes extends Command { - constructor(client) { - super(client, { - name: "memes", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["mem"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const tag = args[0]; - const subs = ["memes", "dankmemes", "me_irl", "wholesomememes"]; - - if (tag === "list") { - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(message.translate("fun/memes:EMBED_TITLE")) - .setDescription(subs.join("\n")) - .setTimestamp(); - - message.reply({ - embeds: [embed] - }); - } else if (!tag) { - const m = await message.sendT("fun/memes:SEARCHING_RANDOM"); - - const res = await fetch("https://meme-api.herokuapp.com/gimme/").then(response => response.json()); - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) - .setImage(res.url) - .setTimestamp(); - - m.edit({ - content: null, - embeds: [embed] - }); - } else if (subs.includes(tag)) { - const m = await message.sendT("fun/memes:SEARCHING", { - tag - }); - - const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) - .setImage(res.url) - .setTimestamp(); - - m.edit({ - content: null, - embeds: [embed] - }); - } else return message.error("fun/memes:NOT_FOUND"); - } -} - -module.exports = Memes; \ No newline at end of file diff --git a/commands/General/activity.js b/commands/General/activity.js deleted file mode 100644 index aa8d852f..00000000 --- a/commands/General/activity.js +++ /dev/null @@ -1,263 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Activity extends Command { - constructor(client) { - super(client, { - name: "activity", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["act"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - - const perms = voice.permissionsFor(this.client.user); - if (!perms.has(Discord.Permissions.FLAGS.CONNECT) || !perms.has(Discord.Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); - - const activities = [ - "betrayal", - `checkers (${message.translate("general/activity:NO_BOOST")})`, - `chess (${message.translate("general/activity:NO_BOOST")})`, - "sketchheads", - `ocho (${message.translate("general/activity:NO_BOOST")})`, - "fishing", - "lettertile", - `poker (${message.translate("general/activity:NO_BOOST")})`, - `spellcast (${message.translate("general/activity:NO_BOOST")})`, - "wordsnack", - "puttparty", - "youtube" - ]; - const activity = args[0]; - - switch (activity) { - case "betrayal": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "betrayal").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Betrayal.io") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Betrayal.io", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "checkers": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "checkers").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Checkers In The Park") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Checkers In The Park", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "chess": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "chess").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Chess In The Park") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Chess In The Park", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "sketchheads": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "sketchheads").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Sketch Heads") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Sketch Heads", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "ocho": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "ocho").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Ocho") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Ocho", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "fishing": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "fishing").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Fishington.io") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Fishington.io", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "lettertile": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "lettertile").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Letter Tile") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Letter Tile", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "poker": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "poker").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Poker Night") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Poker Night", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "spellcast": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "spellcast").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Spell Cast") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Spell Cast", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "wordsnack": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "wordsnack").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Words Snack") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Words Snack", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "puttparty": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "puttparty").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Puttparty") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Puttparty", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "youtube": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "youtube").then(async invite => { - const embed = new Discord.MessageEmbed() - .setTitle("Youtube Together") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Youtube Together", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - default: { - const embed = new Discord.MessageEmbed() - .setTitle(message.translate("general/activity:TITLE")) - .setDescription(activities.join("\n")) - .setColor(data.config.embed.color) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - message.reply({ - embeds: [embed] - }); - } - } - } -} - -module.exports = Activity; \ No newline at end of file diff --git a/commands/General/emoji.js b/commands/General/emoji.js deleted file mode 100644 index bfbfd5bf..00000000 --- a/commands/General/emoji.js +++ /dev/null @@ -1,46 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class EmojiInfo extends Command { - constructor(client) { - super(client, { - name: "emoji", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["emi"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const rawEmoji = args[0]; - if (!rawEmoji) return message.error("administration/stealemoji:MISSING_EMOJI"); - - const parsedEmoji = Discord.Util.parseEmoji(rawEmoji); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/emoji:TITLE", { - emoji: parsedEmoji.name - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .addField(message.translate("general/emoji:NAME"), parsedEmoji.name) - .addField(message.translate("general/emoji:ANIMATED"), parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO")) - .addField(message.translate("general/emoji:ID"), parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART")); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = EmojiInfo; \ No newline at end of file diff --git a/commands/General/help.js b/commands/General/help.js deleted file mode 100644 index 882c3d08..00000000 --- a/commands/General/help.js +++ /dev/null @@ -1,117 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Help extends Command { - constructor(client) { - super(client, { - name: "help", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["h", "commands"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (args[0]) { - const isCustom = (message.guild && data.guild.customCommands ? data.guild.customCommands.find((c) => c.name === args[0]) : false); - - const cmd = this.client.commands.get(args[0]) || this.client.commands.get(this.client.aliases.get(args[0])); - if (!cmd && isCustom) { - return message.error("general/help:CUSTOM", { - cmd: args[0] - }); - } else if (!cmd) { - return message.error("general/help:NOT_FOUND", { - search: args[0] - }); - } - - const description = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:DESCRIPTION`); - const usage = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:USAGE`, { - prefix: message.guild ? data.guild.prefix : "" - }); - const examples = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:EXAMPLES`, { - prefix: message.guild ? data.guild.prefix : "" - }); - - const groupEmbed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/help:CMD_TITLE", { - cmd: cmd.help.name - }) - }) - .addField(message.translate("general/help:FIELD_DESCRIPTION"), description) - .addField(message.translate("general/help:FIELD_USAGE"), usage) - .addField(message.translate("general/help:FIELD_EXAMPLES"), examples) - .addField(message.translate("general/help:FIELD_ALIASES"), cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS")) - .addField(message.translate("general/help:FIELD_PERMISSIONS"), cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION")) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - return message.reply({ - embeds: [groupEmbed] - }); - } - - const categories = []; - const commands = this.client.commands; - - commands.forEach((command) => { - if (!categories.includes(command.help.category)) { - if (command.help.category === "Owner" && message.author.id !== data.config.owner.id) return; - categories.push(command.help.category); - } - }); - - const emojis = this.client.customEmojis; - - const embed = new Discord.MessageEmbed() - .setDescription(message.translate("general/help:INFO", { - prefix: message.guild ? data.guild.prefix : "" - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - categories.sort().forEach((cat) => { - const tCommands = commands.filter((cmd) => cmd.help.category === cat); - embed.addField(`${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`, `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}`); - }); - - if (message.guild) { - if (data.guild.customCommands.length > 0) embed.addField(`${emojis.categories.custom} ${message.guild.name} | ${message.translate("general/help:CUSTOM_COMMANDS")} - (${data.guild.customCommands.length})`, data.guild.customCommands.map((cmd) => `\`${cmd.name}\``).join(", ")); - } - - embed.addField("\u200B", message.translate("misc:STATS_FOOTER", { - dashboardLink: this.client.config.dashboard.baseURL, - docsLink: `${this.client.config.dashboard.baseURL}/docs/`, - inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }), - donateLink: "https://qiwi.com/n/JONNYBRO/", - owner: data.config.owner.id - })); - embed.setAuthor({ - name: message.translate("general/help:TITLE", { - name: this.client.user.username - }), - iconURL: this.client.user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }); - - return message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Help; \ No newline at end of file diff --git a/commands/General/invite.js b/commands/General/invite.js deleted file mode 100644 index 04b1910c..00000000 --- a/commands/General/invite.js +++ /dev/null @@ -1,57 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Invite extends Command { - constructor(client) { - super(client, { - name: "invite", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["i", "add", "vote"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const inviteLink = this.client.generateInvite({ - scopes: ["bot", "applications.commands"], - permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] - }); - const donateLink = "https://qiwi.com/n/JONNYBRO/"; - // const voteURL = `https://discordbots.org/bot/${this.client.user.id}/vote`; - - if (args[0] && args[0] === "copy") return message.reply({ - content: inviteLink - }); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/invite:LINKS") - }) - .setDescription(message.translate("general/invite:TIP", { - prefix: data.guild.prefix || "" - })) - .addField(message.translate("general/invite:ADD"), message.translate("general/invite:CLICK", { - link: inviteLink - })) - .addField(message.translate("general/invite:SUPPORT"), message.translate("general/invite:CLICK", { - link: donateLink - }) + `\n*для других способов пишите в ЛС <@${data.config.owner.id}> (указывайте ваш Discord тэг чтобы я мог выдать вам ачивку)*`) - // .addField(message.translate("general/invite:VOTE"), voteURL) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Invite; \ No newline at end of file diff --git a/commands/General/invites.js b/commands/General/invites.js deleted file mode 100644 index 64621010..00000000 --- a/commands/General/invites.js +++ /dev/null @@ -1,72 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Invites extends Command { - constructor(client) { - super(client, { - name: "invites", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["invs"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_GUILD"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let member = await this.client.resolveMember(args[0], message.guild); - if (!member) member = message.member; - - const invites = await message.guild.invites.fetch().catch(() => {}); - if (!invites) return message.error("misc:ERR_OCCURRED"); - - const memberInvites = invites.filter((i) => i.inviter && i.inviter.id === member.user.id); - - if (memberInvites.size <= 0) { - if (member === message.member) { - return message.error("general/invites:NOBODY_AUTHOR"); - } else { - return message.error("general/invites:NOBODY_MEMBER", { - member: member.user.tag - }); - } - } - - const content = memberInvites.map((i) => { - return message.translate("general/invites:CODE", { - uses: i.uses, - code: i.code, - channel: i.channel.toString() - }); - }).join("\n"); - let index = 0; - memberInvites.forEach((invite) => index += invite.uses); - - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setAuthor({ - name: message.translate("general/invites:TRACKER") - }) - .setDescription(message.translate("general/invites:TITLE", { - member: member.user.tag, - guild: message.guild.name - })) - .addField(message.translate("general/invites:FIELD_INVITED"), message.translate("general/invites:FIELD_MEMBERS", { - total: index - })) - .addField(message.translate("general/invites:FIELD_CODES"), content); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Invites; \ No newline at end of file diff --git a/commands/General/minecraft.js b/commands/General/minecraft.js deleted file mode 100644 index 22679cf7..00000000 --- a/commands/General/minecraft.js +++ /dev/null @@ -1,85 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - gamedig = require("gamedig"); - -class Minecraft extends Command { - constructor(client) { - super(client, { - name: "minecraft", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["mc"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const ip = args[0]; - if (!ip) return message.error("general/minecraft:MISSING_IP"); - - const favicon = `https://eu.mc-api.net/v3/server/favicon/${ip}`; - let options = { - type: "minecraft", - host: ip - }; - - if (ip.split(":").length > 1) { - const ipp = ip.split(":"); - options = { - type: "minecraft", - host: ipp[0], - port: ipp[1] - }; - } - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - let json = null; - - await gamedig.query(options).then((res) => { - json = res; - }).catch((err) => { - console.error(err); - }); - - if (!json) { - options.type = "minecraftpe"; - await gamedig.query(options).then((res) => { - json = res; - }).catch((err) => { - console.error(err); - }); - } - - if (!json) return m.error("general/minecraft:FAILED", null, { edit: true }); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: json.name - }) - .addField(message.translate("general/minecraft:FIELD_STATUS"), message.translate("general/minecraft:ONLINE")) - .addField(message.translate("general/minecraft:FIELD_CONNECTED"), `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}`) - .addField(message.translate("general/minecraft:FIELD_IP"), json.connect, true) - .addField(message.translate("general/minecraft:FIELD_VERSION"), json.raw.vanilla.raw.version.name, true) - .addField(message.translate("general/minecraft:FIELD_PING"), json.raw.vanilla.ping.toString()) - .setColor(data.config.embed.color) - .setThumbnail(favicon) - .setFooter({ - text: data.config.embed.footer - }); - - m.edit({ - content: null, - embeds: [embed] - }); - } -} - -module.exports = Minecraft; \ No newline at end of file diff --git a/commands/General/permissions.js b/commands/General/permissions.js deleted file mode 100644 index de3c1ef0..00000000 --- a/commands/General/permissions.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const permissions = Object.keys(Discord.Permissions.FLAGS); - -class Permissions extends Command { - constructor(client) { - super(client, { - name: "permissions", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["perms"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message) { - const member = message.mentions.members.first() || message.member; - const mPermissions = message.channel.permissionsFor(member); - const total = { - denied: 0, - allowed: 0 - }; - - let text = `**${message.translate("general/permissions:TITLE", { user: member.user.username, channel: message.channel.name })}**\n`; - permissions.forEach((perm) => { - if (perm === "REQUEST_TO_SPEAK") return; - - if (!mPermissions.has(perm)) { - text += `${message.translate(`misc:PERMISSIONS:${perm}`)} ❌\n`; - total.denied++; - } else { - text += `${message.translate(`misc:PERMISSIONS:${perm}`)} ✅\n`; - total.allowed++; - } - }); - text += `\n${total.allowed} ✅ | ${total.denied} ❌`; - - message.reply({ - content: text - }); - } -} - -module.exports = Permissions; \ No newline at end of file diff --git a/commands/General/ping.js b/commands/General/ping.js deleted file mode 100644 index 1d8238d9..00000000 --- a/commands/General/ping.js +++ /dev/null @@ -1,30 +0,0 @@ -const Command = require("../../base/Command"); - -class Ping extends Command { - constructor(client) { - super(client, { - name: "ping", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["pi"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message) { - message.sendT("general/ping:CONTENT", { - ping: "..." - }).then((m) => { - m.sendT("general/ping:CONTENT", { - ping: Math.round(this.client.ws.ping) - }, { edit: true }); - }); - } -} - -module.exports = Ping; \ No newline at end of file diff --git a/commands/General/quote.js b/commands/General/quote.js deleted file mode 100644 index f464a03f..00000000 --- a/commands/General/quote.js +++ /dev/null @@ -1,88 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Quote extends Command { - constructor(client) { - super(client, { - name: "quote", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["qu"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - function embed(m) { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: m.author.tag, - iconURL: m.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setDescription(m.content) - .setColor(m.member ? m.member.roles.highest ? m.member.roles.highest.color : data.config.embed.color : data.config.embed.color) - .setFooter({ - text: m.guild.name + " | #" + m.channel.name - }) - .setTimestamp(m.createdTimestamp); - if (m.attachments.size > 0) embed.setImage(m.attachments.first().url); - return embed; - } - - const msgID = args[0]; - if (isNaN(msgID)) { - message.error("general/quote:MISSING_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - } - - let channel = args[1]; - if (args[1]) { - channel = this.client.channels.cache.get(args[1]); - if (!channel) { - message.error("general/quote:NO_MESSAGE_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - } - } - - if (!channel) { - message.channel.messages.fetch(msgID).catch(() => { - message.error("general/quote:NO_MESSAGE_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - }).then((msg) => { - if (message.deletable) message.delete(); - message.reply({ - embeds: [embed(msg)] - }); - }); - } else { - channel.messages.fetch(msgID).then((msg) => { - if (message.deletable) message.delete(); - message.reply({ - embeds: [embed(msg)] - }); - }).catch(() => { - message.error("general/quote:NO_MESSAGE_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - }); - } - } -} - -module.exports = Quote; \ No newline at end of file diff --git a/commands/General/remindme.js b/commands/General/remindme.js deleted file mode 100644 index eb5861b6..00000000 --- a/commands/General/remindme.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - ms = require("ms"); - -class Remindme extends Command { - constructor(client) { - super(client, { - name: "remindme", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["reminder", "remind", "rem"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const time = args[0]; - if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME"); - - const msg = args.slice(1).join(" "); - if (!msg) return message.error("general/remindme:MISSING_MESSAGE"); - - const rData = { - message: msg, - createdAt: Date.now(), - sendAt: Date.now() + ms(time) - }; - - if (!data.userData.reminds) data.userData.reminds = []; - - - data.userData.reminds.push(rData); - data.userData.markModified("reminds"); - data.userData.save(); - this.client.databaseCache.usersReminds.set(message.author.id, data.userData); - - message.success("general/remindme:SAVED"); - } -} - -module.exports = Remindme; \ No newline at end of file diff --git a/commands/General/report.js b/commands/General/report.js deleted file mode 100644 index 288d0901..00000000 --- a/commands/General/report.js +++ /dev/null @@ -1,69 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Report extends Command { - constructor(client) { - super(client, { - name: "report", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["repo"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (message.author.id === "285109105717280768") return message.reply({ content: "Пошёл нахуй фахон" }); - - const repChannel = message.guild.channels.cache.get(data.guild.plugins.reports); - if (!repChannel) return message.error("general/report:MISSING_CHANNEL"); - - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("general/report:MISSING_USER"); - if (member.id === message.author.id) return message.error("general/report:INVALID_USER"); - - const rep = args.slice(1).join(" "); - if (!rep) return message.error("general/report:MISSING_REASON"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/report:TITLE", { - user: member.user.tag - }), - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .addField(message.translate("common:AUTHOR"), message.author.tag, true) - .addField(message.translate("common:DATE"), message.printDate(new Date(Date.now())), true) - .addField(message.translate("common:REASON"), rep, true) - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const success = Discord.Util.parseEmoji(this.client.customEmojis.success).id; - const error = Discord.Util.parseEmoji(this.client.customEmojis.error).id; - - repChannel.send({ - embeds: [embed] - }).then(async (m) => { - await m.react(success); - await m.react(error); - }); - - message.success("general/report:SUCCESS", { - channel: repChannel.toString() - }); - } -} - -module.exports = Report; \ No newline at end of file diff --git a/commands/General/serverinfo.js b/commands/General/serverinfo.js deleted file mode 100644 index 77925b44..00000000 --- a/commands/General/serverinfo.js +++ /dev/null @@ -1,71 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Serverinfo extends Command { - constructor(client) { - super(client, { - name: "serverinfo", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["si"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let guild = message.guild; - - if (args[0]) { - let found = this.client.guilds.cache.get(args[0]); - if (!found) { - found = this.client.guilds.cache.find(g => g.name.includes(args.join(" ")) || g.id === args[0]); - if (found) guild = found; - } - } - - await guild.members.fetch(); - const owner = await guild.fetchOwner(); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: guild.name, - iconURL: guild.iconURL({ - dynamic: true - }) - }) - .setThumbnail(guild.iconURL({ - dynamic: true - })) - .addField(this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"), `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})`) - .addField(this.client.customEmojis.title + message.translate("common:NAME"), guild.name, true) - .addField(this.client.customEmojis.calendar + message.translate("common:CREATION"), message.printDate(guild.createdAt), true) - .addField(this.client.customEmojis.users + message.translate("common:MEMBERS"), - `${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` + - "\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`, true - ) - .addField(this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"), guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"), true) - .addField(this.client.customEmojis.id + message.translate("common:ID"), guild.id, true) - .addField(this.client.customEmojis.crown + message.translate("common:OWNER"), owner.toString(), true) - .addField(this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"), guild.premiumSubscriptionCount.toString() || "0", true) - .addField(this.client.customEmojis.channels + message.translate("common:CHANNELS"), - `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` + - "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` + - "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`, true - ) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Serverinfo; \ No newline at end of file diff --git a/commands/General/setafk.js b/commands/General/setafk.js deleted file mode 100644 index 2d54f2b4..00000000 --- a/commands/General/setafk.js +++ /dev/null @@ -1,49 +0,0 @@ -const Command = require("../../base/Command"); - -class Setafk extends Command { - constructor(client) { - super(client, { - name: "setafk", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["afk"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const reason = args.join(" "); - if (!reason || reason.length > 250) return message.error("general/setafk:MISSING_REASON"); - - if (reason === "delete") { - if (data.userData.afk) { - data.userData.afk = null; - data.userData.save(); - - return message.sendT("general/setafk:DELETED", { - username: message.author.username - }); - } - } else { - data.userData.afk = reason; - data.userData.save(); - - const m = await message.success("general/setafk:SUCCESS", { - reason, - prefix: message.guild ? data.guild.prefix : "" - }); - - setTimeout(() => { - if (m.deletable) m.delete(); - if (message.deletable) message.delete(); - }, 10 * 1000); - } - } -} - -module.exports = Setafk; \ No newline at end of file diff --git a/commands/General/shorturl.js b/commands/General/shorturl.js deleted file mode 100644 index d353f77a..00000000 --- a/commands/General/shorturl.js +++ /dev/null @@ -1,42 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class ShortURL extends Command { - constructor(client) { - super(client, { - name: "shorturl", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["minimize"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const url = args[0]; - if (!url) return message.error("general/shorturl:MISSING_URL"); - - const res = await fetch(`https://is.gd/create.php?format=simple&url=${encodeURI(url)}`); - const body = await res.text(); - - if (body === "Error: Please enter a valid URL to shorten") return message.error("general/shorturl:MISSING_URL"); - - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setDescription(body); - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = ShortURL; \ No newline at end of file diff --git a/commands/General/staff.js b/commands/General/staff.js deleted file mode 100644 index e05204ae..00000000 --- a/commands/General/staff.js +++ /dev/null @@ -1,42 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Staff extends Command { - constructor(client) { - super(client, { - name: "staff", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["staf"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - await message.guild.members.fetch(); - const administrators = message.guild.members.cache.filter((m) => m.permissions.has(Discord.Permissions.FLAGS.ADMINISTRATOR) && !m.user.bot); - const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(Discord.Permissions.FLAGS.MANAGE_MESSAGES) && !m.user.bot); - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/staff:TITLE", { - guild: message.guild.name - }) - }) - .addField(message.translate("general/staff:ADMINS"), (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS"))) - .addField(message.translate("general/staff:MODS"), (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS"))) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Staff; \ No newline at end of file diff --git a/commands/General/stats.js b/commands/General/stats.js deleted file mode 100644 index 5ff799e6..00000000 --- a/commands/General/stats.js +++ /dev/null @@ -1,63 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Stats extends Command { - constructor(client) { - super(client, { - name: "stats", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["stat"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const hiddenGuild = await this.client.guilds.fetch("568120814776614924"); - const users = this.client.users.cache.size - hiddenGuild.memberCount; - const servers = this.client.guilds.cache.size - 1; - - const statsEmbed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setAuthor({ - name: message.translate("common:STATS") - }) - .setDescription(message.translate("general/stats:MADE")) - .addField(this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"), message.translate("general/stats:COUNTS_CONTENT", { - servers: servers, - users: users - }), true) - .addField(this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"), `\`Discord.js : v${Discord.version}\`\n\`Nodejs : v${process.versions.node}\``, true) - .addField(this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"), `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, true) - .addField(this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"), message.translate("general/stats:ONLINE_CONTENT", { - time: message.convertTime(Date.now() + this.client.uptime, "from", true) - })) - .addField(this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"), message.translate("general/stats:MUSIC_CONTENT", { - count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}` - })) - .addField(message.translate("general/stats:CREDITS_TITLE"), message.translate("general/stats:CREDITS_CONTENT", { - donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"), - translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua:"].join("\n") - })) - .addField(this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"), message.translate("misc:STATS_FOOTER", { - dashboardLink: this.client.config.dashboard.baseURL, - docsLink: `${this.client.config.dashboard.baseURL}/docs/`, - inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }), - donateLink: "https://qiwi.com/n/JONNYBRO/", - owner: data.config.owner.id - })); - message.reply({ - embeds: [statsEmbed] - }); - } -} - -module.exports = Stats; \ No newline at end of file diff --git a/commands/General/suggest.js b/commands/General/suggest.js deleted file mode 100644 index 12631f24..00000000 --- a/commands/General/suggest.js +++ /dev/null @@ -1,64 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Suggest extends Command { - constructor(client) { - super(client, { - name: "suggest", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["sugg"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (message.author.id === "285109105717280768") return message.reply({ content: "Пошёл нахуй фахон" }); - - const suggChannel = message.guild.channels.cache.get(data.guild.plugins.suggestions); - if (!suggChannel) return message.error("general/suggest:MISSING_CHANNEL"); - - const sugg = args.join(" "); - if (!sugg) return message.error("general/suggest:MISSING_CONTENT"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/suggest:TITLE", { - user: message.author.username - }), - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .addField(message.translate("common:AUTHOR"), `\`${message.author.username}#${message.author.discriminator}\``, true) - .addField(message.translate("common:DATE"), message.printDate(new Date(Date.now())), true) - .addField(message.translate("common:CONTENT"), sugg) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const success = Discord.Util.parseEmoji(this.client.customEmojis.cool).id; - const error = Discord.Util.parseEmoji(this.client.customEmojis.notcool).id; - - suggChannel.send({ - embeds: [embed] - }).then(async (m) => { - await m.react(success); - await m.react(error); - }); - - message.success("general/suggest:SUCCESS", { - channel: suggChannel.toString() - }); - } -} - -module.exports = Suggest; \ No newline at end of file diff --git a/commands/General/translate.js b/commands/General/translate.js deleted file mode 100644 index b5bb2219..00000000 --- a/commands/General/translate.js +++ /dev/null @@ -1,72 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - translate = require("@k3rn31p4nic/google-translate-api"); - -const langs = ["afrikaans", "albanian", "amharic", "arabic", "armenian", "azerbaijani", "bangla", "basque", "belarusian", "bengali", "bosnian", "bulgarian", "burmese", "catalan", "cebuano", "chichewa", "corsican", "croatian", "czech", "danish", "dutch", "english", "esperanto", "estonian", "filipino", "finnish", "french", "frisian", "galician", "georgian", "german", "greek", "gujarati", "haitian creole", "hausa", "hawaiian", "hebrew", "hindi", "hmong", "hungarian", "icelandic", "igbo", "indonesian", "irish", "italian", "japanese", "javanese", "kannada", "kazakh", "khmer", "korean", "kurdish (kurmanji)", "kyrgyz", "lao", "latin", "latvian", "lithuanian", "luxembourgish", "macedonian", "malagasy", "malay", "malayalam", "maltese", "maori", "marathi", "mongolian", "myanmar (burmese)", "nepali", "norwegian", "nyanja", "pashto", "persian", "polish", "portugese", "punjabi", "romanian", "russian", "samoan", "scottish gaelic", "serbian", "sesotho", "shona", "sindhi", "sinhala", "slovak", "slovenian", "somali", "spanish", "sundanese", "swahili", "swedish", "tajik", "tamil", "telugu", "thai", "turkish", "ukrainian", "urdu", "uzbek", "vietnamese", "welsh", "xhosa", "yiddish", "yoruba", "zulu"]; - -class Translate extends Command { - constructor(client) { - super(client, { - name: "translate", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["tran"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - if (args[0] === "langs-list") { - const langsList = "```css\n" + (langs.map((lang, i) => `${i + 1} - ${lang}`).join("\n")) + "```"; - message.author.send(langsList).then(() => { - message.success("general/translate:LIST_SENT"); - }).catch(() => { - message.error("misc:CANNOT_DM"); - }); - return; - } - - const pWait = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - if (!args[0]) return pWait.error("general/translate:MISSING_LANGUAGE", { prefix: data.guild.prefix }, { edit: true }); - if (!args[1]) return pWait.error("general/translate:MISSING_CONTENT", null, { edit: true }); - - // Gets different args - const language = args[0].toLowerCase(); - const toTranslate = args.slice(1).join(" "); - - if (!langs.includes(language)) return pWait.error("general/translate:INVALID_LANGUAGE", { prefix: data.guild.prefix, search: language }, { edit: true }); - - const translated = await translate(toTranslate, { to: language }); - - const resEmbed = new Discord.MessageEmbed() - .setAuthor({ - name: "Переводчик", - iconURL: this.client.user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .addField(translated.from.language.iso, "```" + toTranslate + "```") - .addField(language, "```" + translated.text + "```") - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - return pWait.edit({ - content: null, - embeds: [resEmbed] - }); - } -} - -module.exports = Translate; \ No newline at end of file diff --git a/commands/General/userinfo.js b/commands/General/userinfo.js deleted file mode 100644 index f8ba012d..00000000 --- a/commands/General/userinfo.js +++ /dev/null @@ -1,114 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class Userinfo extends Command { - constructor(client) { - super(client, { - name: "userinfo", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ui"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let displayPresence = true; - - const isID = !isNaN(args[0]); - - let user; - if (!args[0]) user = message.author; - if (message.mentions.users.first()) user = message.mentions.users.first(); - - if (isID && !user) { - user = this.client.users.cache.get(args[0]); - if (!user) { - user = await this.client.users.fetch(args[0], true).catch(() => {}); - displayPresence = false; - } - } - - if (!user) return message.error("general/userinfo:INVALID_USER"); - - let member = null; - if (message.guild) member = await message.guild.members.fetch(user).catch(() => {}); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: `${user.tag} (${user.id})`, - iconURL: user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setThumbnail(user.displayAvatarURL({ - dynamic: true - })) - .addField(":man: " + message.translate("common:USERNAME"), user.username, true) - .addField(this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"), user.discriminator, true) - .addField(this.client.customEmojis.bot + " " + message.translate("common:ROBOT"), (user.bot ? message.translate("common:YES") : message.translate("common:NO")), true) - .addField(this.client.customEmojis.calendar + " " + message.translate("common:CREATION"), message.printDate(user.createdAt), true) - .addField(this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - if (displayPresence) { - if (member.presence.activities[0].name === "Custom Status") { - embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")), true); - embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true); - } else { - embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")), true); - embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true); - } - } - - if (member) { - // embed.addField(this.client.customEmojis.up + " " + message.translate("general/userinfo:ROLE"), (member.roles.highest ? member.roles.highest : message.translate("general/userinfo:NO_ROLE")), true) - embed.addField(this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"), message.printDate(member.joinedAt), true); - embed.addField(this.client.customEmojis.color + " " + message.translate("common:COLOR"), member.displayHexColor, true); - embed.addField(this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"), (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")), true); - embed.addField(this.client.customEmojis.roles + " " + message.translate("common:ROLES"), (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", { - count: member.roles.cache.size - 10 - }) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", "))); - } - - if (user.bot && data.config.apiKeys.dbl && (data.config.apiKeys.dbl !== "")) { - const res = await fetch("https://discordbots.org/api/bots/" + user.id, { - headers: { - "Authorization": data.config.apiKeys.dbl - } - }); - const data = await res.json(); - if (!data.error) { - embed.addField(this.client.customEmojis.desc + " " + message.translate("common:DESCRIPTION"), data.shortdesc, true) - .addField(this.client.customEmojis.stats + " " + message.translate("common:STATS"), message.translate("general/userinfo:BOT_STATS", { - votes: data.monthlyPoints || 0, - servers: data.server_count || 0, - shards: (data.shards || [0]).length, - lib: data.lib || "unknown" - }), true) - .addField(this.client.customEmojis.link + " " + message.translate("common:LINKS"), `${data.support ? `[${message.translate("common:SUPPORT")}](${data.support}) | ` : ""}${data.invite ? `[${message.translate("common:INVITE")}](${data.invite}) | ` : ""}${data.github ? `[GitHub](${data.github}) | ` : ""}${data.website ? `[${message.translate("common:WEBSITE")}](${data.website})` : ""}`, true); - } - } - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Userinfo; \ No newline at end of file diff --git a/commands/General/whois.js b/commands/General/whois.js deleted file mode 100644 index 93c741c4..00000000 --- a/commands/General/whois.js +++ /dev/null @@ -1,73 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class Whois extends Command { - constructor(client) { - super(client, { - name: "whois", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ip"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (!args[0]) return message.error("general/whois:NO_IP"); - - const whois = await fetch(`http://ip-api.com/json/${args[0]}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json()); - - if (whois.status === "fail") { - const embed = new Discord.MessageEmbed() - .setDescription(whois.message) - .setTitle(message.translate("general/whois:ERROR", { - ip: args[0] - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - } - - const embed = new Discord.MessageEmbed() - .setTitle(message.translate("general/whois:INFO_ABOUT", { - ip: args[0] - })) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color) - .addFields( - { name: "IP", value: whois.query, inline: true }, - { name: message.translate("general/whois:COUNTRY"), value: `${whois.country || "Неизвестно"} (${whois.countryCode || "Неизвестно"})`, inline: true }, - { name: message.translate("general/whois:REGION"), value: `${whois.regionName || "Неизвестно"} (${whois.region || "Неизвестно"})`, inline: true }, - { name: message.translate("general/whois:CITY"), value: `${whois.city || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:ZIP"), value: `${whois.zip || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || "Неизвестно"} (${whois.continentCode || "Неизвестно"})`, inline: true }, - { name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:ISP"), value: `${whois.isp || "Неизвестно"}`, inline: true } - ) - .setTimestamp(); - - if (whois.proxy == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:PROXY") }); - else if (whois.mobile == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:MOBILE") }); - else if (whois.hosting == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:HOSTING") }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Whois; \ No newline at end of file diff --git a/commands/Images/approved.js b/commands/Images/approved.js deleted file mode 100644 index 9f9eb5bd..00000000 --- a/commands/Images/approved.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Approved extends Command { - constructor(client) { - super(client, { - name: "approved", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("approved", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "approved.png", - attachment: buffer - }] - }); - } -} - -module.exports = Approved; \ No newline at end of file diff --git a/commands/Images/avatar.js b/commands/Images/avatar.js deleted file mode 100644 index f875f72a..00000000 --- a/commands/Images/avatar.js +++ /dev/null @@ -1,37 +0,0 @@ -const Command = require("../../base/Command"); - -class Avatar extends Command { - constructor(client) { - super(client, { - name: "avatar", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - let user = await this.client.resolveUser(args[0]); - if (!user) user = message.author; - const avatarURL = user.displayAvatarURL({ - dynamic: true, - size: 512 - }); - - if (args[0] === "link") return message.reply({ content: `<${avatarURL}>` }); - - message.reply({ - files: [{ - attachment: avatarURL - }] - }); - } -} - -module.exports = Avatar; \ No newline at end of file diff --git a/commands/Images/batslap.js b/commands/Images/batslap.js deleted file mode 100644 index 991d2ab1..00000000 --- a/commands/Images/batslap.js +++ /dev/null @@ -1,48 +0,0 @@ -const Command = require("../../base/Command"); - -class BatSlap extends Command { - constructor(client) { - super(client, { - name: "batslap", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const users = [ - await this.client.resolveUser(args[0]) || message.author, - await this.client.resolveUser(args[1]) || message.author - ]; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("batslap", { - avatar: users[0].displayAvatarURL({ - format: "png", - size: 512 - }), - url: users[1].displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "batslap.png", - attachment: buffer - }] - }); - } -} - -module.exports = BatSlap; \ No newline at end of file diff --git a/commands/Images/beautiful.js b/commands/Images/beautiful.js deleted file mode 100644 index b0aae472..00000000 --- a/commands/Images/beautiful.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Beautiful extends Command { - constructor(client) { - super(client, { - name: "beautiful", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("beautiful", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "beautiful.png", - attachment: buffer - }] - }); - } -} - -module.exports = Beautiful; \ No newline at end of file diff --git a/commands/Images/bed.js b/commands/Images/bed.js deleted file mode 100644 index a8ade40c..00000000 --- a/commands/Images/bed.js +++ /dev/null @@ -1,52 +0,0 @@ -const Command = require("../../base/Command"), - canvacord = require("canvacord"); - -class Bed extends Command { - constructor(client) { - super(client, { - name: "bed", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const users = [ - await this.client.resolveUser(args[0]) || message.author, - await this.client.resolveUser(args[1]) || message.author - ]; - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - try { - const buffer = await canvacord.Canvas.bed(users[0].displayAvatarURL({ - format: "png" - }), users[1].displayAvatarURL({ - format: "png" - })); - m.delete(); - - message.reply({ - files: [{ - name: "bed.png", - attachment: buffer - }] - }); - } catch (e) { - console.log(e); - m.error("misc:ERR_OCCURRED", null, { - edit: true - }); - } - } -} - -module.exports = Bed; \ No newline at end of file diff --git a/commands/Images/brazzers.js b/commands/Images/brazzers.js deleted file mode 100644 index c57d6be0..00000000 --- a/commands/Images/brazzers.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Brazzers extends Command { - constructor(client) { - super(client, { - name: "brazzers", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("brazzers", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "brazzers.png", - attachment: buffer - }] - }); - } -} - -module.exports = Brazzers; \ No newline at end of file diff --git a/commands/Images/burn.js b/commands/Images/burn.js deleted file mode 100644 index 2e160e1d..00000000 --- a/commands/Images/burn.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Burn extends Command { - constructor(client) { - super(client, { - name: "burn", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("burn", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "burn.png", - attachment: buffer - }] - }); - } -} - -module.exports = Burn; \ No newline at end of file diff --git a/commands/Images/captcha.js b/commands/Images/captcha.js deleted file mode 100644 index 5cb4d6fb..00000000 --- a/commands/Images/captcha.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - fetch = require("node-fetch"); - -class Captcha extends Command { - constructor(client) { - super(client, { - name: "captcha", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - try { - const res = await fetch(encodeURI(`https://nekobot.xyz/api/imagegen?type=captcha&username=${user.username}&url=${user.displayAvatarURL({ format: "png", size: 512 })}`)); - const json = await res.json(); - m.delete(); - - message.reply({ - files: [{ - name: "captcha.png", - attachment: json.message - }] - }); - } catch (e) { - console.log(e); - m.error("misc:ERR_OCCURRED", null, { - edit: true - }); - } - } -} - -module.exports = Captcha; \ No newline at end of file diff --git a/commands/Images/challenger.js b/commands/Images/challenger.js deleted file mode 100644 index f4dfd693..00000000 --- a/commands/Images/challenger.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Challenger extends Command { - constructor(client) { - super(client, { - name: "challenger", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["cha"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("challenger", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "challenger.png", - attachment: buffer - }] - }); - } -} - -module.exports = Challenger; \ No newline at end of file diff --git a/commands/Images/clyde.js b/commands/Images/clyde.js deleted file mode 100644 index ddaf1d58..00000000 --- a/commands/Images/clyde.js +++ /dev/null @@ -1,47 +0,0 @@ -const Command = require("../../base/Command"), - fetch = require("node-fetch"); - -class Clyde extends Command { - constructor(client) { - super(client, { - name: "clyde", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const text = args.join(" "); - - if (!text) return message.error("images/clyde:MISSING_TEXT"); - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - try { - const res = await fetch(encodeURI(`https://nekobot.xyz/api/imagegen?type=clyde&text=${text}`)); - const json = await res.json(); - message.reply({ - files: [{ - name: "clyde.png", - attachment: json.message - }] - }); - m.delete(); - } catch (e) { - console.log(e); - m.error("misc:ERR_OCCURRED", null, { - edit: true - }); - } - } -} - -module.exports = Clyde; \ No newline at end of file diff --git a/commands/Images/crush.js b/commands/Images/crush.js deleted file mode 100644 index c89e5c25..00000000 --- a/commands/Images/crush.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Crush extends Command { - constructor(client) { - super(client, { - name: "crush", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("crush", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "crush.png", - attachment: buffer - }] - }); - } -} - -module.exports = Crush; \ No newline at end of file diff --git a/commands/Images/dictator.js b/commands/Images/dictator.js deleted file mode 100644 index 2ccbc6e5..00000000 --- a/commands/Images/dictator.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Dictator extends Command { - constructor(client) { - super(client, { - name: "dictator", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("dictator", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "dictator.png", - attachment: buffer - }] - }); - } -} - -module.exports = Dictator; \ No newline at end of file diff --git a/commands/Images/facepalm.js b/commands/Images/facepalm.js deleted file mode 100644 index d08e8575..00000000 --- a/commands/Images/facepalm.js +++ /dev/null @@ -1,55 +0,0 @@ -const Command = require("../../base/Command"), - Canvas = require("canvas"); - -class Facepalm extends Command { - constructor(client) { - super(client, { - name: "facepalm", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["palm"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author, - m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - const canvas = Canvas.createCanvas(632, 357), - ctx = canvas.getContext("2d"); - - // Draw background for transparent avatar - ctx.fillStyle = "black"; - ctx.fillRect(0, 0, 632, 357); - - // Draw avatar - const avatar = await Canvas.loadImage(user.displayAvatarURL({ - format: "png", - size: 512 - })); - ctx.drawImage(avatar, 199, 112, 235, 235); - - // Draw layer - const layer = await Canvas.loadImage("./assets/img/facepalm.png"); - ctx.drawImage(layer, 0, 0, 632, 357); - - m.delete(); - - message.reply({ - files: [{ - name: "facepalm.png", - attachment: canvas.toBuffer() - }] - }); - } -} - -module.exports = Facepalm; \ No newline at end of file diff --git a/commands/Images/fire.js b/commands/Images/fire.js deleted file mode 100644 index d7f2851b..00000000 --- a/commands/Images/fire.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Fire extends Command { - constructor(client) { - super(client, { - name: "fire", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("fire", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "fire.png", - attachment: buffer - }] - }); - } -} - -module.exports = Fire; \ No newline at end of file diff --git a/commands/Images/jail.js b/commands/Images/jail.js deleted file mode 100644 index b8b50c07..00000000 --- a/commands/Images/jail.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Jail extends Command { - constructor(client) { - super(client, { - name: "jail", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ja"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("jail", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "jail.png", - attachment: buffer - }] - }); - } -} - -module.exports = Jail; \ No newline at end of file diff --git a/commands/Images/love.js b/commands/Images/love.js deleted file mode 100644 index 63cad35f..00000000 --- a/commands/Images/love.js +++ /dev/null @@ -1,48 +0,0 @@ -const Command = require("../../base/Command"), - fetch = require("node-fetch"); - -class Love extends Command { - constructor(client) { - super(client, { - name: "love", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const users = [ - await this.client.resolveUser(args[0]) || message.author, - await this.client.resolveUser(args[1]) || message.author - ]; - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - try { - const res = await fetch(encodeURI(`https://nekobot.xyz/api/imagegen?type=ship&user1=${users[0].displayAvatarURL({ format: "png", size: 512 })}&user2=${users[1].displayAvatarURL({ format: "png", size: 512 })}`)); - const json = await res.json(); - message.reply({ - files: [{ - name: "love.png", - attachment: json.message - }] - }); - m.delete(); - } catch (e) { - console.log(e); - m.error("misc:ERR_OCCURRED", null, { - edit: true - }); - } - } -} - -module.exports = Love; \ No newline at end of file diff --git a/commands/Images/magik.js b/commands/Images/magik.js deleted file mode 100644 index edf3499a..00000000 --- a/commands/Images/magik.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Magik extends Command { - constructor(client) { - super(client, { - name: "magik", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("magik", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "magik.png", - attachment: buffer - }] - }); - } -} - -module.exports = Magik; \ No newline at end of file diff --git a/commands/Images/mission.js b/commands/Images/mission.js deleted file mode 100644 index 13088b0b..00000000 --- a/commands/Images/mission.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Mission extends Command { - constructor(client) { - super(client, { - name: "mission", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("missionpassed", { - url: user.displayAvatarURL({ - format: "png", - size: 2048 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "mission.png", - attachment: buffer - }] - }); - } -} - -module.exports = Mission; \ No newline at end of file diff --git a/commands/Images/phcomment.js b/commands/Images/phcomment.js deleted file mode 100644 index 42dd77bd..00000000 --- a/commands/Images/phcomment.js +++ /dev/null @@ -1,58 +0,0 @@ -const Command = require("../../base/Command"), - canvacord = require("canvacord"); - -class Phcomment extends Command { - constructor(client) { - super(client, { - name: "phcomment", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - let user = await this.client.resolveUser(args[0]); - let text = args.join(" "); - - if (user) text = args.slice(1).join(" "); - else user = message.author; - - if (!text) return message.error("images/phcomment:MISSING_TEXT"); - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - try { - const buffer = await canvacord.Canvas.phub({ - username: user.username, - image: user.displayAvatarURL({ - format: "png" - }), - message: text - }); - m.delete(); - - message.reply({ - files: [{ - name: "phcomment.png", - attachment: buffer - }] - }); - } catch (e) { - console.log(e); - m.error("misc:ERR_OCCURRED", null, { - edit: true - }); - } - } -} - -module.exports = Phcomment; \ No newline at end of file diff --git a/commands/Images/ps4.js b/commands/Images/ps4.js deleted file mode 100644 index 42641627..00000000 --- a/commands/Images/ps4.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Ps4 extends Command { - constructor(client) { - super(client, { - name: "ps4", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("ps4", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "ps4.png", - attachment: buffer - }] - }); - } -} - -module.exports = Ps4; \ No newline at end of file diff --git a/commands/Images/qrcode.js b/commands/Images/qrcode.js deleted file mode 100644 index 5ccfab3c..00000000 --- a/commands/Images/qrcode.js +++ /dev/null @@ -1,39 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Qrcode extends Command { - constructor(client) { - super(client, { - name: "qrcode", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["qr"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const text = args.join(" "); - if (!text) return message.error("images/qrcode:MISSING_TEXT"); - - const pleaseWait = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - const embed = new Discord.MessageEmbed() - .setImage(`https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${text.replace(new RegExp(" ", "g"), "%20")}`) - .setColor(data.config.embed.color); - - pleaseWait.edit({ - content: message.translate("images/qrcode:SUCCESS"), - embeds: [embed] - }); - } -} - -module.exports = Qrcode; \ No newline at end of file diff --git a/commands/Images/rip.js b/commands/Images/rip.js deleted file mode 100644 index b6645d71..00000000 --- a/commands/Images/rip.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Rip extends Command { - constructor(client) { - super(client, { - name: "rip", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("rip", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "rip.png", - attachment: buffer - }] - }); - } -} - -module.exports = Rip; \ No newline at end of file diff --git a/commands/Images/scary.js b/commands/Images/scary.js deleted file mode 100644 index 80afea39..00000000 --- a/commands/Images/scary.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Scary extends Command { - constructor(client) { - super(client, { - name: "scary", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("scary", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "scary.png", - attachment: buffer - }] - }); - } -} - -module.exports = Scary; \ No newline at end of file diff --git a/commands/Images/steamcard.js b/commands/Images/steamcard.js deleted file mode 100644 index 6f47aa38..00000000 --- a/commands/Images/steamcard.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"); - -class SteamCard extends Command { - constructor(client) { - super(client, { - name: "steamcard", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["sc"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const nArgs = args.join(" ").split(new RegExp(/ <(@!|@)(\d+)>/)); - if (!args[0]) return message.error("images/qrcode:MISSING_TEXT"); - - const user = await this.client.resolveUser(nArgs[1]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("steamcard", { - text: nArgs[0], - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "steamcard.png", - attachment: buffer - }] - }); - } -} - -module.exports = SteamCard; \ No newline at end of file diff --git a/commands/Images/tobecontinued.js b/commands/Images/tobecontinued.js deleted file mode 100644 index 5f9e3afa..00000000 --- a/commands/Images/tobecontinued.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Tobecontinued extends Command { - constructor(client) { - super(client, { - name: "tobecontinued", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("tobecontinued", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "tobecontinued.png", - attachment: buffer - }] - }); - } -} - -module.exports = Tobecontinued; \ No newline at end of file diff --git a/commands/Images/trash.js b/commands/Images/trash.js deleted file mode 100644 index c417beb6..00000000 --- a/commands/Images/trash.js +++ /dev/null @@ -1,40 +0,0 @@ -const Command = require("../../base/Command"), - canvacord = require("canvacord"); - -class Trash extends Command { - constructor(client) { - super(client, { - name: "trash", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await canvacord.Canvas.trash(user.displayAvatarURL({ - format: "png", - size: 512 - })); - m.delete(); - - message.reply({ - files: [{ - name: "trash.png", - attachment: buffer - }] - }); - } -} - -module.exports = Trash; \ No newline at end of file diff --git a/commands/Images/triggered.js b/commands/Images/triggered.js deleted file mode 100644 index 43366e15..00000000 --- a/commands/Images/triggered.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Triggered extends Command { - constructor(client) { - super(client, { - name: "triggered", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("triggered", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "triggered.gif", - attachment: buffer - }] - }); - } -} - -module.exports = Triggered; \ No newline at end of file diff --git a/commands/Images/wanted.js b/commands/Images/wanted.js deleted file mode 100644 index 85df9457..00000000 --- a/commands/Images/wanted.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Wanted extends Command { - constructor(client) { - super(client, { - name: "wanted", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("wanted", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "wanted.png", - attachment: buffer - }] - }); - } -} - -module.exports = Wanted; \ No newline at end of file diff --git a/commands/Images/wasted.js b/commands/Images/wasted.js deleted file mode 100644 index 6e9bf472..00000000 --- a/commands/Images/wasted.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Wasted extends Command { - constructor(client) { - super(client, { - name: "wasted", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const user = await this.client.resolveUser(args[0]) || message.author; - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const buffer = await this.client.AmeAPI.generate("wasted", { - url: user.displayAvatarURL({ - format: "png", - size: 512 - }) - }); - m.delete(); - - message.reply({ - files: [{ - name: "wasted.png", - attachment: buffer - }] - }); - } -} - -module.exports = Wasted; \ No newline at end of file diff --git a/commands/Images/youtube-comment.js b/commands/Images/youtube-comment.js deleted file mode 100644 index dafe2c7e..00000000 --- a/commands/Images/youtube-comment.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"), - canvacord = require("canvacord"); - -class Ytcomment extends Command { - constructor(client) { - super(client, { - name: "ytcomment", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - let user = await this.client.resolveUser(args[0]); - let text = args.join(" "); - - if (user) text = args.slice(1).join(" "); - else user = message.author; - - if (!text) return message.error("images/phcomment:MISSING_TEXT"); // same text as phcomment - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - const image = await canvacord.Canvas.youtube({ - username: user.username, - avatar: user.displayAvatarURL({ - format: "png" - }), - content: text - }); - m.delete(); - - message.reply({ - files: [{ - name: "ytcomment.png", - attachment: image - }] - }); - } -} - -module.exports = Ytcomment; \ No newline at end of file diff --git a/commands/Mention.js b/commands/Mention.js new file mode 100644 index 00000000..4ea58a6e --- /dev/null +++ b/commands/Mention.js @@ -0,0 +1,35 @@ +const BaseCommand = require("../base/BaseCommand"); + +class Mention extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor() { + super({ + command: { + name: "mention", + type: 2 // Type 2 is MESSAGE COMMAND. + }, + aliases: ["m"], // Application command aliases. + guildOnly: true // Determines whether your command is only guild. + }); + } + /** + * + * @param {import("../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../base/JaBa")} client + * @param {import("discord.js").ContextMenuInteraction} interaction + */ + async execute(client, interaction) { + const target = interaction.member.guild.members.cache.get(interaction.targetId); + return interaction.reply({ content: target.toString(), ephemeral: false, fetchReply: true }).then(m => setTimeout(() => m.delete(), 5000)); + } +} +module.exports = Mention; \ No newline at end of file diff --git a/commands/Moderation/announcement.js b/commands/Moderation/announcement.js deleted file mode 100644 index e6a604bc..00000000 --- a/commands/Moderation/announcement.js +++ /dev/null @@ -1,99 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Announcement extends Command { - constructor(client) { - super(client, { - name: "announcement", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ann"], - memberPermissions: ["MENTION_EVERYONE"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const text = args.join(" "); - if (!text) return message.error("moderation/announcement:MISSING_TEXT"); - if (text.length > 1030) return message.error("moderation/announcement:TOO_LONG"); - - let mention = null; - const msg = await message.sendT("moderation/announcement:MENTION_PROMPT"); - - const filter = m => m.author.id === message.author.id; - const collector = new Discord.MessageCollector(message.channel, { - filter, - time: 240000 - }); - - collector.on("collect", async (tmsg) => { - if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { - tmsg.delete(); - msg.delete(); - collector.stop(true); - - if (message.deletable) message.delete(); - } - - if (tmsg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - tmsg.delete(); - msg.delete(); - const tmsg1 = await message.channel.send(message.translate("moderation/announcement:MENTION_TYPE_PROMPT")); - - const filter = m => m.author.id === message.author.id; - const c = new Discord.MessageCollector(message.channel, { - filter, - time: 60000 - }); - c.on("collect", (m) => { - if (m.content.toLowerCase() === "here") { - mention = "@here"; - tmsg1.delete(); - m.delete(); - collector.stop(true); - c.stop(true); - } else if (m.content.toLowerCase() === "everyone") { - mention = "@everyone"; - tmsg1.delete(); - m.delete(); - collector.stop(true); - c.stop(true); - } - }); - - c.on("end", (collected, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - - if (message.deletable) message.delete(); - } - }); - - collector.on("end", (collected, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/announcement:TITLE") - }) - .setColor(data.config.embed.color) - .setFooter({ - text: message.author.tag - }) - .setTimestamp() - .setDescription(text); - - message.channel.send({ - content: mention, - embeds: [embed] - }); - }); - } -} - -module.exports = Announcement; \ No newline at end of file diff --git a/commands/Moderation/ban.js b/commands/Moderation/ban.js deleted file mode 100644 index 16090e9c..00000000 --- a/commands/Moderation/ban.js +++ /dev/null @@ -1,112 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Ban extends Command { - constructor(client) { - super(client, { - name: "ban", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["b"], - memberPermissions: ["BAN_MEMBERS"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const user = await this.client.resolveUser(args[0]); - if (!user) return message.error("moderation/ban:MISSING_MEMBER"); - - const memberData = message.guild.members.cache.get(user.id) ? await this.client.findOrCreateMember({ - id: user.id, - guildID: message.guild.id - }) : null; - - if (user.id === message.author.id) return message.error("moderation/ban:YOURSELF"); - - // If the user is already banned - const banned = await message.guild.bans.fetch(); - if (banned.some((m) => m.user.id === user.id)) return message.error("moderation/ban:ALREADY_BANNED", { - username: user.tag - }); - - // Gets the ban reason - let reason = args.slice(1).join(" "); - if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); - - const member = await message.guild.members.fetch(user.id).catch(() => {}); - if (member) { - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - if (!member.bannable) return message.error("moderation/ban:MISSING_PERM"); - } - - await user.send(message.translate("moderation/ban:BANNED_DM", { - username: user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - })).catch(() => {}); - - // Ban the user - message.guild.members.ban(user, { - reason - }).then(() => { - // Send a success message in the current channel - message.reply({ - content: message.translate("moderation/ban:BANNED", { - username: user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "ban", - case: data.guild.casesCount, - reason - }; - - if (memberData) { - memberData.sanctions.push(caseInfo); - memberData.save(); - } - - data.guild.casesCount++; - data.guild.save(); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/ban:CASE", { - count: data.guild.casesCount - }) - }) - .addField(message.translate("common:USER"), `\`${user.tag}\` (${user.toString()})`, true) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) - .addField(message.translate("common:REASON"), reason, true) - .setColor("#e02316"); - channel.send({ - embeds: [embed] - }); - } - - }).catch((err) => { - console.log(err); - return message.error("moderation/ban:MISSING_PERM"); - }); - } -} - -module.exports = Ban; \ No newline at end of file diff --git a/commands/Moderation/clear.js b/commands/Moderation/clear.js deleted file mode 100644 index e4b1c27d..00000000 --- a/commands/Moderation/clear.js +++ /dev/null @@ -1,80 +0,0 @@ -const Command = require("../../base/Command"); - -class Clear extends Command { - constructor(client) { - super(client, { - name: "clear", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["cl", "purge"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - if (args[0] === "all") { - message.channel.send(message.translate("moderation/clear:ALL_CONFIRM")); - - const filter = m => m.author.id === message.author.id && m.content === "confirm"; - const collector = message.channel.createMessageCollector({ - filter, - time: 120000 // 2 minutes - }); - - collector.on("collect", async message => { - const position = message.channel.position; - const newChannel = await message.channel.clone(); - await message.channel.delete(); - newChannel.setPosition(position); - return newChannel.send({ - content: message.translate("moderation/clear:CHANNEL_CLEARED") - }); - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - } else { - const amount = args[0]; - if (!amount || isNaN(amount) || parseInt(amount) < 1) return message.error("moderation/clear:MISSING_AMOUNT"); - - await message.delete(); - - const user = message.mentions.users.first(); - - let messages = await message.channel.messages.fetch({ - limit: amount - }); - if (user) messages = messages.filter((m) => m.author.id === user.id); - if (messages.length > amount) messages.length = parseInt(amount, 10); - - messages = messages.filter((m) => !m.pinned); - - message.channel.bulkDelete(messages, true); - - let toDelete = null; - - if (user) { - toDelete = await message.channel.send(message.translate("moderation/clear:CLEARED_MEMBER", { - amount: `${amount} ${message.getNoun(amount, message.translate("misc:NOUNS:MESSAGES:1"), message.translate("misc:NOUNS:MESSAGES:2"), message.translate("misc:NOUNS:MESSAGES:5"))}`, - username: user.tag - })); - } else { - toDelete = await message.channel.send(message.translate("moderation/clear:CLEARED", { - amount: `${amount} ${message.getNoun(amount, message.translate("misc:NOUNS:MESSAGES:1"), message.translate("misc:NOUNS:MESSAGES:2"), message.translate("misc:NOUNS:MESSAGES:5"))}` - })); - } - - setTimeout(function () { - toDelete.delete(); - }, 2000); - } - } -} - -module.exports = Clear; \ No newline at end of file diff --git a/commands/Moderation/clearwarns.js b/commands/Moderation/clearwarns.js deleted file mode 100644 index 5303012f..00000000 --- a/commands/Moderation/clearwarns.js +++ /dev/null @@ -1,35 +0,0 @@ -const Command = require("../../base/Command"); - -class Clearwarns extends Command { - constructor(client) { - super(client, { - name: "clearwarns", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["clearw", "clw"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/clearwarns:MISSING_MEMBER"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - memberData.sanctions = []; - memberData.save(); - message.success("moderation/clearwarns:SUCCESS", { - username: member.user.tag - }); - } -} - -module.exports = Clearwarns; \ No newline at end of file diff --git a/commands/Moderation/giveaway.js b/commands/Moderation/giveaway.js deleted file mode 100644 index e90878f7..00000000 --- a/commands/Moderation/giveaway.js +++ /dev/null @@ -1,127 +0,0 @@ -const Command = require("../../base/Command"), - ms = require("ms"); - -class Giveaway extends Command { - constructor(client) { - super(client, { - name: "giveaway", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["gaway"], - memberPermissions: ["MENTION_EVERYONE"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const status = args[0]; - if (!status) return message.error("moderation/giveaway:MISSING_STATUS"); - - if (status === "create") { - const currentGiveaways = this.client.giveawaysManager.giveaways.filter((g) => g.guildId === message.guild.id && !g.ended).length; - if (currentGiveaways > 3) return message.error("moderation/giveaway:MAX_COUNT"); - - const time = args[1]; - if (!time) return message.error("moderation/giveaway:INVALID_CREATE", { prefix: data.guild.prefix }); - if (isNaN(ms(time))) return message.error("misc:INVALID_TIME"); - if (ms(time) > ms("15d")) return message.error("moderation/giveaway:MAX_DURATION"); - - const winnersCount = args[2]; - if (!winnersCount) return message.error("moderation/giveaway:INVALID_CREATE", { prefix: data.guild.prefix }); - if (isNaN(winnersCount) || winnersCount > 10 || winnersCount < 1) return message.error("misc:INVALID_NUMBER_RANGE", { min: 1, max: 10 }); - - const drop = (args[3] === "true"); - let prize = args.slice(3).join(" "); - - if (drop) prize = args.slice(4).join(" "); - else prize = args.slice(3).join(" "); - - if (!prize) return message.error("moderation/giveaway:INVALID_CREATE", { prefix: data.guild.prefix }); - - this.client.giveawaysManager.start(message.channel, { - duration: ms(time), - winnerCount: parseInt(winnersCount, 10), - prize: prize, - hostedBy: message.author, - isDrop: drop, - messages: { - giveaway: message.translate("moderation/giveaway:TITLE"), - giveawayEnded: message.translate("moderation/giveaway:ENDED"), - timeRemaining: message.translate("moderation/giveaway:TIME_REMAINING"), - inviteToParticipate: message.translate("moderation/giveaway:INVITE_PARTICIPATE"), - winMessage: message.translate("moderation/giveaway:WIN_MESSAGE"), - drawing: message.translate("moderation/giveaway:DRAWING"), - dropMessage: message.translate("moderation/giveaway:DROP"), - embedFooter: message.translate("moderation/giveaway:FOOTER"), - noWinner: message.translate("moderation/giveaway:NO_WINNER"), - winners: message.translate("moderation/giveaway:WINNERS"), - endedAt: message.translate("moderation/giveaway:END_AT"), - hostedBy: message.translate("moderation/giveaway:HOSTEDBY"), - units: { - seconds: message.translate("time:SECONDS", { - amount: "" - }).trim(), - minutes: message.translate("time:MINUTES", { - amount: "" - }).trim(), - hours: message.translate("time:HOURS", { - amount: "" - }).trim(), - days: message.translate("time:DAYS", { - amount: "" - }).trim() - } - } - }).then(() => { - message.success("moderation/giveaway:GIVEAWAY_CREATED"); - }); - } else if (status === "reroll") { - const messageID = args[1]; - if (!messageID) return message.error("moderation/giveaway:MISSING_ID"); - - this.client.giveawaysManager.reroll(messageID, { - messages: { - congrat: message.translate("moderation/giveaway:REROLL_CONGRAT"), - error: message.translate("moderation/giveaway:REROLL_ERROR") - } - }).then(() => { - return message.success("moderation/giveaway:GIVEAWAY_REROLLED"); - }).catch(() => { - return message.error("moderation/giveaway:NOT_FOUND_ENDED", { - messageID - }); - }); - } else if (status === "delete") { - const messageID = args[1]; - if (!messageID) return message.error("moderation/giveaway:MISSING_ID"); - - this.client.giveawaysManager.delete(messageID).then(() => { - return message.success("moderation/giveaway:GIVEAWAY_DELETED"); - }).catch(() => { - return message.error("moderation/giveaway:NOT_FOUND", { - messageID - }); - }); - } else if (status === "end") { - const messageID = args[1]; - if (!messageID) return message.error("moderation/giveaway:MISSING_ID"); - - try { - this.client.giveawaysManager.end(messageID); - return message.success("moderation/giveaway:GIVEAWAY_ENDED"); - } catch (e) { - return message.error("moderation/giveaway:NOT_FOUND", { - messageID - }); - } - } else { - return message.error("moderation/giveaway:MISSING_STATUS"); - } - } -} - -module.exports = Giveaway; \ No newline at end of file diff --git a/commands/Moderation/kick.js b/commands/Moderation/kick.js deleted file mode 100644 index c2fbee21..00000000 --- a/commands/Moderation/kick.js +++ /dev/null @@ -1,100 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Kick extends Command { - constructor(client) { - super(client, { - name: "kick", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["k"], - memberPermissions: ["KICK_MEMBERS"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "KICK_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/kick:MISSING_MEMBER"); - - if (member.id === message.author.id) return message.error("moderation/kick:YOURSELF"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - // Gets the kcik reason - let reason = args.slice(1).join(" "); - if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - if (!member.kickable) return message.error("moderation/kick:MISSING_PERM"); - - await member.send({ - content: message.translate("moderation/kick:KICKED_DM", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - - // Kick the user - member.kick(reason).then(() => { - // Send a success message in the current channel - message.reply({ - content: message.translate("moderation/kick:KICKED", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - - data.guild.casesCount++; - data.guild.save(); - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "kick", - case: data.guild.casesCount, - reason, - }; - - memberData.sanctions.push(caseInfo); - memberData.save(); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/kick:CASE", { - count: data.guild.casesCount - }) - }) - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) - .addField(message.translate("common:REASON"), reason, true) - .setColor("#e88709"); - channel.send({ - embeds: [embed] - }); - } - - }).catch(() => { - return message.error("moderation/kick:MISSING_PERM"); - }); - } -} - -module.exports = Kick; \ No newline at end of file diff --git a/commands/Moderation/mute.js b/commands/Moderation/mute.js deleted file mode 100644 index b952fbb2..00000000 --- a/commands/Moderation/mute.js +++ /dev/null @@ -1,113 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - ms = require("ms"); - -class Mute extends Command { - constructor(client) { - super(client, { - name: "mute", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["m"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/mute:MISSING_MEMBER"); - if (member.id === message.author.id) return message.error("moderation/mute:YOURSELF"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - const time = args[1]; - if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME"); - let reason = args.slice(2).join(" "); - if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); - - message.guild.channels.cache.forEach((channel) => { - channel.permissionOverwrites.edit(member.id, { - SEND_MESSAGES: false, - ADD_REACTIONS: false, - CONNECT: false - }).catch(() => {}); - }); - - member.send({ - content: message.translate("moderation/mute:MUTED_DM", { - username: member.user.username, - server: message.guild.name, - moderator: message.author.tag, - time, - reason - }) - }); - - message.success("moderation/mute:MUTED", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - time, - reason - }); - - data.guild.casesCount++; - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "mute", - case: data.guild.casesCount, - reason, - time - }; - - memberData.mute.muted = true; - memberData.mute.endDate = Date.now() + ms(time); - memberData.mute.case = data.guild.casesCount; - memberData.sanctions.push(caseInfo); - - memberData.markModified("sanctions"); - memberData.markModified("mute"); - - await memberData.save(); - await data.guild.save(); - - this.client.databaseCache.mutedUsers.set(`${member.id}${message.guild.id}`, memberData); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/mute:CASE", { - count: data.guild.casesCount - }) - }) - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) - .addField(message.translate("common:REASON"), reason, true) - .addField(message.translate("common:DURATION"), time, true) - .addField(message.translate("common:EXPIRY"), message.printDate(new Date(Date.now() + ms(time))), true) - .setColor("#f44271"); - channel.send({ - embeds: [embed] - }); - } - } -} - -module.exports = Mute; \ No newline at end of file diff --git a/commands/Moderation/poll.js b/commands/Moderation/poll.js deleted file mode 100644 index 070c607e..00000000 --- a/commands/Moderation/poll.js +++ /dev/null @@ -1,109 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Poll extends Command { - constructor(client) { - super(client, { - name: "poll", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["po"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const question = args.join(" "); - if (!question) return message.error("moderation/poll:MISSING_QUESTION"); - - let mention = null; - const msg = await message.sendT("moderation/announcement:MENTION_PROMPT"); - - const filter = m => m.author.id === message.author.id; - const collector = new Discord.MessageCollector(message.channel, { - filter, - time: 240000 - }); - - collector.on("collect", async (tmsg) => { - if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { - tmsg.delete(); - msg.delete(); - collector.stop(true); - - message.delete(); - } - - if (tmsg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - tmsg.delete(); - msg.delete(); - const tmsg1 = await message.channel.send(message.translate("moderation/announcement:MENTION_TYPE_PROMPT")); - - const filter = m => m.author.id === message.author.id; - const c = new Discord.MessageCollector(message.channel, { - filter, - time: 60000 - }); - - c.on("collect", (m) => { - if (m.content.toLowerCase() === "here") { - mention = "@here"; - tmsg1.delete(); - m.delete(); - collector.stop(true); - c.stop(true); - } else if (m.content.toLowerCase() === "everyone") { - mention = "@everyone"; - tmsg1.delete(); - m.delete(); - collector.stop(true); - c.stop(true); - } - }); - - c.on("end", (collected, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - - message.delete(); - } - }); - - collector.on("end", (collected, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - - const success = this.client.customEmojis.success.split(":")[1]; - const error = this.client.customEmojis.error.split(":")[1]; - - const emojis = [ - this.client.emojis.cache.find(e => e.name === success), - this.client.emojis.cache.find(e => e.name === error) - ]; - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/poll:TITLE") - }) - .setColor(data.config.embed.color) - .addField(question, message.translate("moderation/poll:REACT", { - success: emojis[0].toString(), - error: emojis[1].toString() - })); - - message.channel.send({ - content: mention, - embeds: [embed] - }).then(async (m) => { - await m.react(emojis[0]); - await m.react(emojis[1]); - }); - }); - } -} - -module.exports = Poll; \ No newline at end of file diff --git a/commands/Moderation/sanctions.js b/commands/Moderation/sanctions.js deleted file mode 100644 index 794267f3..00000000 --- a/commands/Moderation/sanctions.js +++ /dev/null @@ -1,61 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Warns extends Command { - constructor(client) { - super(client, { - name: "warns", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ws"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const user = await this.client.resolveUser(args[0]); - if (!user) return message.error("moderation/warns:MISSING_MEMBER"); - - const memberData = await this.client.findOrCreateMember({ - id: user.id, - guildID: message.guild.id - }); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: user.tag, - iconURL: user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - if (memberData.sanctions.length < 1) { - embed.setDescription(message.translate("moderation/warns:NO_SANCTION", { - username: user.tag - })); - return message.reply({ - embeds: [embed] - }); - } else { - memberData.sanctions.forEach((s) => { - embed.addField(s.type + " | #" + s.case, `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`, true); - }); - } - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Warns; \ No newline at end of file diff --git a/commands/Moderation/setwarns.js b/commands/Moderation/setwarns.js deleted file mode 100644 index 8aebfdee..00000000 --- a/commands/Moderation/setwarns.js +++ /dev/null @@ -1,68 +0,0 @@ -const Command = require("../../base/Command"); - -class Setwarns extends Command { - constructor(client) { - super(client, { - name: "setwarns", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setw"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS", "KICK_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const sanction = args[0]; - if (!sanction || (sanction !== "kick" && sanction !== "ban")) return message.error("moderation/setwarns:MISSING_TYPE"); - - const number = args[1]; - - if (number === "reset") { - if (sanction === "kick") { - data.guild.plugins.warnsSanctions.kick = false; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_KICK_RESET", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } else if (sanction === "ban") { - data.guild.plugins.warnsSanctions.ban = false; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_BAN_RESET", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } - } - - if (!number || isNaN(number)) return message.error("misc:INVALID_NUMBER"); - if (number < 1 || number > 10) return message.error("misc:INVALID_NUMBER_RANGE", 1, 10); - - if (sanction === "kick") { - data.guild.plugins.warnsSanctions.kick = number; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_KICK", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } else if (sanction === "ban") { - data.guild.plugins.warnsSanctions.ban = number; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_BAN", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } - } -} - -module.exports = Setwarns; \ No newline at end of file diff --git a/commands/Moderation/unban.js b/commands/Moderation/unban.js deleted file mode 100644 index ea0468be..00000000 --- a/commands/Moderation/unban.js +++ /dev/null @@ -1,60 +0,0 @@ -const Command = require("../../base/Command"); - -class Unban extends Command { - constructor(client) { - super(client, { - name: "unban", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ub"], - memberPermissions: ["BAN_MEMBERS"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - let user = null; - - if (!args[0]) return message.error("moderation/unban:MISSING_ID"); - - // Check if the arg is an ID or a username - const isId = !isNaN(args[0]); - - if (isId) { - // Try to find a user with that ID - await this.client.users.fetch(args[0]).then((u) => { - // if a user was found - user = u; - }).catch(() => {}); - } else if (!isId) { - const arr = args[0].split("#"); - if (arr.length < 2) { - return message.error("misc:NO_USER_FOUND_ID", { - id: args[0] - }); - } - user = this.client.users.filter((u) => u.username === arr[0]).find((u) => u.discriminator === arr[1]); - } - - if (!user) return message.error("misc:NO_USER_FOUND_ID", { id: args[0] }); - - // check if the user is banned - const banned = await message.guild.bans.fetch(); - if (!banned.some((e) => e.user.id === user.id)) return message.success("moderation/unban:NOT_BANNED", { username: user.tag }); - - // Unban user - message.guild.members.unban(user).catch(() => {}); - - // Send a success message in the current channel - message.success("moderation/unban:UNBANNED", { - username: user.tag, - server: message.guild.name - }); - } -} - -module.exports = Unban; \ No newline at end of file diff --git a/commands/Moderation/unmute.js b/commands/Moderation/unmute.js deleted file mode 100644 index 6a8fb313..00000000 --- a/commands/Moderation/unmute.js +++ /dev/null @@ -1,47 +0,0 @@ -const Command = require("../../base/Command"); - -class Unmute extends Command { - constructor(client) { - super(client, { - name: "unmute", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["um"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.success("moderation/unmute:MISSING_MEMBER"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - if (memberData.mute.muted) { - memberData.mute.endDate = Date.now(); - memberData.markModified("mute"); - memberData.save(); - message.success("moderation/unmute:SUCCESS", { - username: member.user.tag - }); - } else { - message.error("moderation/unmute:NOT_MUTED", { - username: member.user.tag - }); - } - } -} - -module.exports = Unmute; \ No newline at end of file diff --git a/commands/Moderation/warn.js b/commands/Moderation/warn.js deleted file mode 100644 index 698978fc..00000000 --- a/commands/Moderation/warn.js +++ /dev/null @@ -1,144 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Warn extends Command { - constructor(client) { - super(client, { - name: "warn", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["w"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/warn:MISSING_MEMBER"); - if (member.user.bot) return message.error("misc:BOT_USER"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - if (member.id === message.author.id) return message.error("moderation/warn:YOURSELF"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - - const reason = args.slice(1).join(" "); - if (!reason) return message.error("moderation/warn:MISSING_REASON"); - - // Gets current member sanctions - const sanctions = memberData.sanctions.filter((s) => s.type === "warn").length; - const banCount = data.guild.plugins.warnsSanctions.ban; - const kickCount = data.guild.plugins.warnsSanctions.kick; - - data.guild.casesCount++; - data.guild.save(); - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "warn", - case: data.guild.casesCount, - reason - }; - - const embed = new Discord.MessageEmbed() - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`) - .addField(message.translate("common:REASON"), reason, true); - - if (banCount) { - if (sanctions >= banCount) { - member.send({ - content: message.translate("moderation/ban:BANNED_DM", { - username: member.user, - moderator: message.author.tag, - server: message.guild.name, - reason - }) - }); - caseInfo.type = "ban"; - embed.setAuthor({ - name: message.translate("moderation/ban:CASE", { - count: data.guild.casesCount - }) - }) - .setColor("#e02316"); - message.guild.members.ban(member).catch(() => {}); - message.success("moderation/setwarns:AUTO_BAN", { - username: member.user.tag, - count: banCount - }); - } - } - - if (kickCount) { - if (sanctions >= kickCount) { - member.send({ - content: message.translate("moderation/kick:KICKED_DM", { - username: member.user, - moderator: message.author.tag, - server: message.guild.name, - reason - }) - }); - caseInfo.type = "kick"; - embed.setAuthor({ - name: message.translate("moderation/kick:CASE", { - count: data.guild.casesCount - }) - }) - .setColor("#e88709"); - member.kick().catch(() => {}); - message.success("moderation/setwarns:AUTO_KICK", { - username: member.user.tag, - count: kickCount - }); - } - } - - member.send({ - content: message.translate("moderation/warn:WARNED_DM", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - caseInfo.type = "warn"; - embed.setAuthor({ - name: message.translate("moderation/warn:CASE", { - caseNumber: data.guild.casesCount - }) - }) - .setColor("#8c14e2"); - message.success("moderation/warn:WARNED", { - username: member.user.tag, - reason - }); - - memberData.sanctions.push(caseInfo); - memberData.save(); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - channel.send({ - embeds: [embed] - }); - } - } -} - -module.exports = Warn; \ No newline at end of file diff --git a/commands/Music/autoplay.js b/commands/Music/autoplay.js deleted file mode 100644 index 2372c601..00000000 --- a/commands/Music/autoplay.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require("../../base/Command"); - -class AutoPlay extends Command { - constructor(client) { - super(client, { - name: "autoplay", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["autop"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const autoplay = queue.toggleAutoplay(); - - message.success(`music/autoplay:SUCCESS_${autoplay ? "ENABLED" : "DISABLED"}`); - } -} - -module.exports = AutoPlay; \ No newline at end of file diff --git a/commands/Music/back.js b/commands/Music/back.js deleted file mode 100644 index e5fac879..00000000 --- a/commands/Music/back.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Back extends Command { - constructor(client) { - super(client, { - name: "back", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["previous"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (!queue.previousSongs[0]) return message.error("music/back:NO_PREV_SONG"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/back:DESCRIPTION") - }) - .setThumbnail(queue.tracks[0].thumbnail) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.previous(message); - embed.setDescription(message.translate("music/back:SUCCESS")); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Back; \ No newline at end of file diff --git a/commands/Music/clip.js b/commands/Music/clip.js deleted file mode 100644 index de287a0e..00000000 --- a/commands/Music/clip.js +++ /dev/null @@ -1,58 +0,0 @@ -const Command = require("../../base/Command"), - fs = require("fs"), - { joinVoiceChannel, createAudioResource, createAudioPlayer, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice"); - -class Clip extends Command { - constructor(client) { - super(client, { - name: "clip", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - const clip = args[0]; - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (getVoiceConnection(message.guild.id)) return message.error("music/clip:ACTIVE_CLIP"); - if (queue) return message.error("music/clip:ACTIVE_QUEUE"); - if (!clip) return message.error("music/clip:NO_ARG"); - if (!fs.existsSync(`./clips/${clip}.mp3`)) return message.error("music/clip:NO_FILE", { file: clip }); - - try { - const connection = joinVoiceChannel({ - channelId: voice.id, - guildId: message.guild.id, - adapterCreator: message.guild.voiceAdapterCreator - }); - - const resource = createAudioResource(fs.createReadStream(`./clips/${clip}.mp3`)); - const player = createAudioPlayer() - .on("error", err => { - connection.destroy(); - console.error(err.message); - }); - - player.play(resource); - connection.subscribe(player); - - player.on(AudioPlayerStatus.Idle, () => { - connection.destroy(); - }); - } catch (error) { - console.error(error); - } - } -} - -module.exports = Clip; \ No newline at end of file diff --git a/commands/Music/clips.js b/commands/Music/clips.js deleted file mode 100644 index e687a05a..00000000 --- a/commands/Music/clips.js +++ /dev/null @@ -1,46 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fs = require("fs"); - -class Clips extends Command { - constructor(client) { - super(client, { - name: "clips", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - fs.readdir("./clips", function (err, files) { - if (err) return console.log("Unable to read directory: " + err); - - const clips = []; - - files.forEach(function (file) { - clips.push(file.substring(0, file.length - 4)); - }); - - const embed = new Discord.MessageEmbed() - .setTitle(message.translate("music/clips:EMBED_TITLE")) - .setDescription(clips.join("\n")) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTimestamp(); - message.reply({ - embeds: [embed] - }); - }); - } -} - -module.exports = Clips; \ No newline at end of file diff --git a/commands/Music/createplaylist.js b/commands/Music/createplaylist.js deleted file mode 100644 index 9c8aa811..00000000 --- a/commands/Music/createplaylist.js +++ /dev/null @@ -1,46 +0,0 @@ -const Command = require("../../base/Command"); - -class CreatePlaylist extends Command { - constructor(client) { - super(client, { - name: "createplaylist", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["cpl", "createpl"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - if (!args) return message.error("music/createplaylist:NO_NAME"); - args = args.join(" ").split(" | "); - - const name = args[0]; - const songs = args[1].split(" "); - if (!name) return message.error("music/createplaylist:NO_NAME"); - if (!songs) return message.error("music/createplaylist:NO_SONGS"); - - const playlist = await this.client.player.createCustomPlaylist(songs, { - member: message.member, - properties: { - name - }, - parallel: true - }); - - data.userData.playlists.push(playlist); - data.userData.markModified("playlists"); - data.userData.save(); - - message.success("music/createplaylist:CREATED", { - name - }); - } -} - -module.exports = CreatePlaylist; \ No newline at end of file diff --git a/commands/Music/filter.js b/commands/Music/filter.js deleted file mode 100644 index d26cea14..00000000 --- a/commands/Music/filter.js +++ /dev/null @@ -1,41 +0,0 @@ -const Command = require("../../base/Command"); - -class Filter extends Command { - constructor(client) { - super(client, { - name: "filter", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["f"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const filter = args[0]; - if (!filter) return message.error("music/filter:MISSING_FILTER", { prefix: data.guild.prefix }); - - if (filter === "off" && queue.filters.length) { - queue.setFilter(false); - message.success("music/filter:REMOVING_FILTER"); - } else if (Object.keys(this.client.player.filters).includes(args[0])) { - queue.setFilter(args[0]); - message.success("music/filter:CHANGING_FILTER"); - } else if (args[0]) return message.error("music/filter:UNKNOWN_FILTER", { - prefix: data.guild.prefix - }); - } -} - -module.exports = Filter; \ No newline at end of file diff --git a/commands/Music/filters.js b/commands/Music/filters.js deleted file mode 100644 index e880d8ab..00000000 --- a/commands/Music/filters.js +++ /dev/null @@ -1,48 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Filters extends Command { - constructor(client) { - super(client, { - name: "filters", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["fs"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const filtersStatuses = [ [], [] ]; - - Object.keys(this.client.player.filters).forEach((filterName) => { - const array = filtersStatuses[0].length > filtersStatuses[1].length ? filtersStatuses[1] : filtersStatuses[0]; - array.push(`${filterName}: ${(queue.filters[filterName] ? this.client.customEmojis.success : this.client.customEmojis.error)}`); - }); - - const list = new Discord.MessageEmbed() - .setDescription(message.translate("music/filters:CONTENT", { - prefix: data.guild.prefix - })) - .addField(message.translate("music/filters:TITLE"), filtersStatuses[0].join("\n"), true) - .addField("** **", filtersStatuses[1].join("\n"), true) - .setColor(data.config.embed.color); - - message.reply({ - embeds: [list] - }); - } -} - -module.exports = Filters; \ No newline at end of file diff --git a/commands/Music/jump.js b/commands/Music/jump.js deleted file mode 100644 index 0006e4fa..00000000 --- a/commands/Music/jump.js +++ /dev/null @@ -1,53 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Jump extends Command { - constructor(client) { - super(client, { - name: "jump", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["j"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const queue = this.client.player.getQueue(message); - const voice = message.member.voice.channel; - const number = parseInt(args[0]); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (number < 0) return message.error("music/jump:NO_PREV_SONG", { prefix: data.guild.prefix }); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/jump:SUCCESS") - }) - .setThumbnail(queue.songs[number].thumbnail) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.jump(message, number); - embed.setDescription(message.translate("music/play:NOW_PLAYING", { - songName: queue.songs[number].name - })); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Jump; \ No newline at end of file diff --git a/commands/Music/loop.js b/commands/Music/loop.js deleted file mode 100644 index 05a19d7a..00000000 --- a/commands/Music/loop.js +++ /dev/null @@ -1,40 +0,0 @@ -const Command = require("../../base/Command"); - -class Loop extends Command { - constructor(client) { - super(client, { - name: "loop", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["repeat", "l"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const type = args[0]; - let mode = null; - if (type === "queue" || type === "all") { - mode = this.client.player.setRepeatMode(message, 2); - } else if (type === "song" || type === "single") { - mode = this.client.player.setRepeatMode(message, 1); - } else { - mode = this.client.player.setRepeatMode(message, 0); - } - - message.success(`music/loop:${mode ? mode === 2 ? "QUEUE" : "SONG" : "DISABLED"}`); - } -} - -module.exports = Loop; \ No newline at end of file diff --git a/commands/Music/lyrics.js b/commands/Music/lyrics.js deleted file mode 100644 index 523ff892..00000000 --- a/commands/Music/lyrics.js +++ /dev/null @@ -1,64 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - lyricsParse = require("lyrics-finder"); - -class Lyrics extends Command { - constructor(client) { - super(client, { - name: "lyrics", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ly"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const [songName, artistName] = args.join(" ").split("|"); - if (!songName) return message.error("music/lyrics:MISSING_SONG_NAME"); - - const embed = new Discord.MessageEmbed() - .setAuthor(message.translate("music/lyrics:LYRICS_OF", { - songName - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - try { - const songNameFormated = songName - .toLowerCase() - .replace(/\(lyrics|lyric|official music video|audio|official|official video|official video hd|clip officiel|clip|extended|hq\)/g, "") - .split(" ").join("%20"); - - let lyrics = await lyricsParse(songNameFormated, artistName) || "Не найдено!"; - - if (lyrics.length > 2040) { - lyrics = lyrics.substr(0, 2000) + message.translate("music/lyrics:AND_MORE") + "\n[" + message.translate("music/lyrics:CLICK_HERE") + "]" + `(https://www.musixmatch.com/search/${songName.replace(" ", "+")})`; - } else if (!lyrics.length) { - return message.error("music/lyrics:NO_LYRICS_FOUND", { - songName - }); - } - - embed.setDescription(lyrics); - message.reply({ - embeds: [embed] - }); - - } catch (e) { - console.log(e); - message.error("music/lyrics:NO_LYRICS_FOUND", { - songName - }); - } - } -} - -module.exports = Lyrics; \ No newline at end of file diff --git a/commands/Music/np.js b/commands/Music/np.js deleted file mode 100644 index 08a5d85a..00000000 --- a/commands/Music/np.js +++ /dev/null @@ -1,63 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Np extends Command { - constructor(client) { - super(client, { - name: "np", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["nowplaying"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const track = queue.songs[0]; - - const status = queue => - `${message.translate("music/np:FILTERS")}: \`${ - queue.filters.join(", ") || message.translate("music/np:DISABLED") - }\` | ${message.translate("music/np:REPEAT")}: \`${ - queue.repeatMode - ? queue.repeatMode === 2 ? message.translate("music/np:QUEUE") : message.translate("music/np:SONG") - : message.translate("music/np:DISABLED") - }\` | ${message.translate("music/np:AUTOPLAY")}: \`${ - queue.autoplay - ? message.translate("music/np:ENABLED") - : message.translate("music/np:DISABLED") - }\``; - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/queue:TITLE") - }) - .setThumbnail(track.thumbnail) - .addField(message.translate("music/np:T_TITLE"), `[${track.name}](${track.url})`) - .addField(message.translate("music/np:T_CHANNEL"), track.uploader.name ? track.uploader.name : "Отсутствует") - .addField(message.translate("music/np:T_DURATION"), `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}`) - .addField(message.translate("music/np:T_CONF"), status(queue)) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTimestamp(); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Np; \ No newline at end of file diff --git a/commands/Music/pause.js b/commands/Music/pause.js deleted file mode 100644 index efa90801..00000000 --- a/commands/Music/pause.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require("../../base/Command"); - -class Pause extends Command { - constructor(client) { - super(client, { - name: "pause", - dirname: __dirname, - enabled: false, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music:play:NOT_PLAYING"); - - await this.client.player.pause(message); - - message.sendT("music/pause:SUCCESS"); - } -} - -module.exports = Pause; \ No newline at end of file diff --git a/commands/Music/play.js b/commands/Music/play.js deleted file mode 100644 index 8ae57349..00000000 --- a/commands/Music/play.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - { Permissions } = require("discord.js"); - -class Play extends Command { - constructor(client) { - super(client, { - name: "play", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["p"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const name = args.join(" "); - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!name) return message.error("music/play:MISSING_SONG_NAME"); - - // Check my permissions - const perms = voice.permissionsFor(this.client.user); - if (!perms.has(Permissions.FLAGS.CONNECT) || !perms.has(Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); - - try { - this.client.player.play(message.member.voice.channel, args.join(" "), { - member: message.member, - textChannel: message.channel, - message - }); - } catch (e) { - message.error("music/play:ERR_OCCURRED", { - error: e - }); - console.error(e); - } - } -} - -module.exports = Play; \ No newline at end of file diff --git a/commands/Music/playlists.js b/commands/Music/playlists.js deleted file mode 100644 index 0b349bec..00000000 --- a/commands/Music/playlists.js +++ /dev/null @@ -1,96 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Playlists extends Command { - constructor(client) { - super(client, { - name: "playlists", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["pls"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const playlists = data.userData.playlists; - - if (args[0]) { - const name = args.join(" "); - let playlist; - - for (const pl of playlists) { - if (!pl.name === name) return message.error("music/removeplaylist:NOT_FOUND", { - name - }); - - playlist = pl; - } - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/playlists:EMBED_TITLE2", { - name - }), - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .addField(message.translate("music/playlists:NAME"), playlist.name, true) - .addField(message.translate("music/playlists:COUNT"), playlist.songs.length.toString(), true); - - const songs = []; - for (const song of playlist.songs) { - songs.push(`[${song.name}](${song.url})`); - } - - embed.addField(message.translate("music/playlists:SONGS"), songs.join("\n")); - - return message.reply({ - embeds: [embed] - }); - } - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/playlists:EMBED_TITLE"), - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const pls = []; - playlists.forEach((pl) => { - pls.push(`${message.translate("music/playlists:NAME")}: ${pl.name}\n${message.translate("music/playlists:COUNT")}: ${pl.songs.length}\n`); - }); - - if (playlists.length < 1) { - embed.setDescription(message.translate("music/playlists:NO_PLAYLISTS")); - } else { - embed.addField(message.translate("music/playlists:PLAYLISTS"), pls.join("\n"), true); - } - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Playlists; \ No newline at end of file diff --git a/commands/Music/playplaylist.js b/commands/Music/playplaylist.js deleted file mode 100644 index 49673bb1..00000000 --- a/commands/Music/playplaylist.js +++ /dev/null @@ -1,54 +0,0 @@ -const Command = require("../../base/Command"), - DisTube = require("distube"), - { Permissions } = require("discord.js"); - -class PlayPlaylists extends Command { - constructor(client) { - super(client, { - name: "playplaylist", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ppl"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const name = args.join(" "); - let playlist; - for (const pl of data.userData.playlists) { - if (!pl.name === name) return message.error("music/removeplaylist:NOT_FOUND", { - name - }); - - playlist = new DisTube.Playlist(pl); - } - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - - // Check my permissions - const perms = voice.permissionsFor(this.client.user); - if (!perms.has(Permissions.FLAGS.CONNECT) || !perms.has(Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); - - try { - this.client.player.play(message.member.voice.channel, playlist, { - member: message.member, - textChannel: message.channel, - message - }); - } catch (e) { - message.error("music/play:ERR_OCCURRED", { - error: e - }); - console.error(e); - } - } -} - -module.exports = PlayPlaylists; \ No newline at end of file diff --git a/commands/Music/queue.js b/commands/Music/queue.js deleted file mode 100644 index 972f0768..00000000 --- a/commands/Music/queue.js +++ /dev/null @@ -1,66 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - Pagination = require("discord-paginationembed"); - -class Queue extends Command { - constructor(client) { - super(client, { - name: "queue", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["q"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - if (queue.songs.length === 1) { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/queue:TITLE"), - iconURL: message.guild.iconURL({ - dynamic: true - }) - }) - .addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`) - .setColor(data.config.embed.color); - return message.reply({ - embeds: [embed] - }); - } - - const FieldsEmbed = new Pagination.FieldsEmbed(); - - FieldsEmbed.embed - .setColor(data.config.embed.color) - .setAuthor({ - name: message.translate("music/queue:TITLE"), - iconURL: message.guild.iconURL({ - dynamic: true - }) - }) - .addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`); - FieldsEmbed - .setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : []) - .setAuthorizedUsers([message.author.id]) - .setChannel(message.channel) - .setElementsPerPage(5) - .setDeleteOnTimeout(true) - .setPageIndicator(true) - .formatField(message.translate("music/queue:TITLE"), (track) => `**${queue.songs.indexOf(track)}**. [${track.name}](${track.url})\n*${message.translate("music/queue:ADDED")} ${track.member}*\n`) - .build(); - } -} - -module.exports = Queue; \ No newline at end of file diff --git a/commands/Music/removeplaylist.js b/commands/Music/removeplaylist.js deleted file mode 100644 index a0a7268a..00000000 --- a/commands/Music/removeplaylist.js +++ /dev/null @@ -1,42 +0,0 @@ -const Command = require("../../base/Command"); - -class RemovePlaylist extends Command { - constructor(client) { - super(client, { - name: "removeplaylist", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["rpl", "removepl"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const name = args.join(" "); - if (!name) return message.error("music/createplaylist:NO_NAME"); - - const playlists = data.userData.playlists; - for (const playlist of playlists) { - if (!playlist.name === name) return message.error("music/removeplaylist:NOT_FOUND", { - name - }); - - const index = playlists.indexOf(playlist); - playlists.splice(index, 1); - - data.userData.markModified("playlists"); - data.userData.save(); - - message.success("music/removeplaylist:REMOVED", { - name - }); - } - } -} - -module.exports = RemovePlaylist; \ No newline at end of file diff --git a/commands/Music/resume.js b/commands/Music/resume.js deleted file mode 100644 index b056d6eb..00000000 --- a/commands/Music/resume.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require("../../base/Command"); - -class Resume extends Command { - constructor(client) { - super(client, { - name: "resume", - dirname: __dirname, - enabled: false, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music:play:NOT_PLAYING"); - - await this.client.player.resume(message); - - message.sendT("music/resume:SUCCESS"); - } -} - -module.exports = Resume; \ No newline at end of file diff --git a/commands/Music/seek.js b/commands/Music/seek.js deleted file mode 100644 index 5501b67f..00000000 --- a/commands/Music/seek.js +++ /dev/null @@ -1,35 +0,0 @@ -const Command = require("../../base/Command"); -const ms = require("ms"); - -class Seek extends Command { - constructor(client) { - super(client, { - name: "seek", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - const time = ms(args[0]) / 1000; - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (isNaN(time)) return message.error("music/seek:INVALID_TIME"); - - await this.client.player.seek(message, time); - - message.sendT("music/seek:SUCCESS"); - } -} - -module.exports = Seek; \ No newline at end of file diff --git a/commands/Music/skip.js b/commands/Music/skip.js deleted file mode 100644 index ff403bc5..00000000 --- a/commands/Music/skip.js +++ /dev/null @@ -1,52 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Skip extends Command { - constructor(client) { - super(client, { - name: "skip", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["s"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (!queue.songs[1]) return message.error("music/skip:NO_NEXT_SONG"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/skip:SUCCESS") - }) - .setThumbnail(queue.songs[1].thumbnail) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.skip(message); - embed.setDescription(message.translate("music/play:NOW_PLAYING", { - songName: queue.songs[1].name - })); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Skip; \ No newline at end of file diff --git a/commands/Music/stop.js b/commands/Music/stop.js deleted file mode 100644 index 6607bf89..00000000 --- a/commands/Music/stop.js +++ /dev/null @@ -1,48 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Stop extends Command { - constructor(client) { - super(client, { - name: "stop", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["leave", "st"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = await this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("music/stop:DESCRIPTION") - }) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.stop(message); - embed.setDescription(message.translate("music/stop:SUCCESS")); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Stop; \ No newline at end of file diff --git a/commands/NSFW/nsfw.js b/commands/NSFW/nsfw.js deleted file mode 100644 index 3dd2500a..00000000 --- a/commands/NSFW/nsfw.js +++ /dev/null @@ -1,78 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class NSFW extends Command { - constructor(client) { - super(client, { - name: "nsfw", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["n"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: true, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const tag = args[0]; - const subs = ["ecchi", "lewdanimegirls", "hentai", "hentaifemdom", "animearmpits", "animefeets", "animebooty", "biganimetiddies", "sideoppai", "ahegao"]; - - if (tag === "list") { - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(message.translate("nsfw/nsfw:EMBED_TITLE")) - .setDescription(subs.join("\n")) - .setTimestamp(); - - message.reply({ - embeds: [embed] - }); - } else if (!tag) { - const m = await message.sendT("nsfw/nsfw:SEARCHING_RANDOM"); - - const res = await fetch("https://meme-api.herokuapp.com/gimme/hentai").then(response => response.json()); - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) - .setImage(res.url) - .setTimestamp(); - - m.edit({ - content: null, - embeds: [embed] - }); - } else if (subs.includes(tag)) { - const m = await message.sendT("nsfw/nsfw:SEARCHING", { - tag - }); - - const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) - .setImage(res.url) - .setTimestamp(); - - m.edit({ - content: null, - embeds: [embed] - }); - } else return message.error("nsfw/nsfw:NOT_FOUND"); - } -} - -module.exports = NSFW; \ No newline at end of file diff --git a/commands/Owner/debug.js b/commands/Owner/debug.js deleted file mode 100644 index 29a594f8..00000000 --- a/commands/Owner/debug.js +++ /dev/null @@ -1,100 +0,0 @@ -const Command = require("../../base/Command"); - -class Debug extends Command { - constructor(client) { - super(client, { - name: "debug", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["deb"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: true, - cooldown: 3000 - }); - } - - async run(message, args) { - const action = args[0]; - if (!action || !["set", "add"].includes(action)) return message.error("owner/debug:NO_ACTION"); - - const status = args[1]; - if (!status || !["level", "xp", "credits", "bank", "rep"].includes(status)) return message.error("owner/debug:NO_STATUS"); - - const member = await this.client.resolveMember(args[2], message.guild); - if (!member) return message.error("owner/debug:INVALID_MEMBER"); - if (member.user.bot) return message.error("owner/debug:BOT_USER"); - - const number = args[3]; - if (!number || isNaN(number)) return message.error("owner/debug:INVALID_AMOUNT"); - const amount = Math.ceil(parseInt(number, 10)); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - const userData = await this.client.findOrCreateUser({ - id: member.id, - }); - - let newValue = 0; - - if (action === "set") { - newValue = parseInt(amount, 10); - - if (status === "level") { - memberData.level = newValue; - memberData.save(); - } else if (status === "xp") { - memberData.exp = newValue; - memberData.save(); - } else if (status === "rep") { - userData.rep = newValue; - userData.save(); - } else if (status === "credits") { - memberData.money = newValue; - memberData.save(); - } else if (status === "bank") { - memberData.bankSold = newValue; - memberData.save(); - } - - message.success("owner/debug:SUCCESS_" + status.toUpperCase(), { - username: member.user.tag, - amount - }); - } else if (action === "add") { - if (status === "level") { - newValue = memberData.level + parseInt(amount, 10); - memberData.level = newValue; - memberData.save(); - } else if (status === "xp") { - newValue = memberData.exp + parseInt(amount, 10); - memberData.exp = newValue; - memberData.save(); - } else if (status === "rep") { - newValue = userData.rep + parseInt(amount, 10); - userData.rep = newValue; - userData.save(); - } else if (status === "credits") { - newValue = memberData.money + parseInt(amount, 10); - memberData.money = newValue; - memberData.save(); - } else if (status === "bank") { - newValue = memberData.bankSold + parseInt(amount, 10); - memberData.bankSold = newValue; - memberData.save(); - } - - message.success("owner/debug:SUCCESS_" + status.toUpperCase(), { - username: member.user.tag, - amount: newValue - }); - } - } -} - -module.exports = Debug; \ No newline at end of file diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js deleted file mode 100644 index ceb54199..00000000 --- a/commands/Owner/eval.js +++ /dev/null @@ -1,43 +0,0 @@ -/* eslint-disable no-unused-vars */ -const Command = require("../../base/Command"); - -class Eval extends Command { - constructor(client) { - super(client, { - name: "eval", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ev"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: true, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const content = message.content.split(" ").slice(1).join(" "); - const result = new Promise((resolve) => resolve(eval(content))); - - return result.then((output) => { - if (typeof output != "string") output = require("util").inspect(output, { - depth: 0 - }); - if (output.includes(this.client.token)) output = output.replace(this.client.token, "T0K3N"); - message.reply({ - content: "```js\n" + output + "```" - }); - }).catch((err) => { - console.error(err); - err = err.toString(); - if (err.includes(this.client.token)) err = err.replace(this.client.token, "T0K3N"); - message.reply({ - content: "```js\n" + err + "```" - }); - }); - } -} - -module.exports = Eval; \ No newline at end of file diff --git a/commands/Owner/reload.js b/commands/Owner/reload.js deleted file mode 100644 index d1ccebcc..00000000 --- a/commands/Owner/reload.js +++ /dev/null @@ -1,38 +0,0 @@ -const Command = require("../../base/Command"), - i18next = require("i18next"), - autoUpdateDocs = require("../../helpers/autoUpdateDocs"); - -class Reload extends Command { - constructor(client) { - super(client, { - name: "reload", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["rel"], - memberPermissions: [], - botPermissions: [], - nsfw: false, - ownerOnly: true, - cooldown: 2000 - }); - } - - async run(message, args) { - const command = args[0]; - const cmd = this.client.commands.get(command) || this.client.commands.get(this.client.aliases.get(command)); - if (!cmd) return message.error("owner/reload:NOT_FOUND", { search: command }); - - await this.client.unloadCommand(cmd.conf.location, cmd.help.name); - await this.client.loadCommand(cmd.conf.location, cmd.help.name); - - i18next.reloadResources(["ru-RU", "uk-UA"]); - autoUpdateDocs.update(this.client); - - message.success("owner/reload:SUCCESS", { - command: cmd.help.name - }); - } -} - -module.exports = Reload; \ No newline at end of file diff --git a/commands/Owner/say.js b/commands/Owner/say.js deleted file mode 100644 index 2b43f819..00000000 --- a/commands/Owner/say.js +++ /dev/null @@ -1,88 +0,0 @@ -const Command = require("../../base/Command"); - -class Say extends Command { - constructor(client) { - super(client, { - name: "say", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: true, - cooldown: 2000 - }); - } - - async run(message, args) { - if (!args[0]) { - if (message.deletable) return message.delete(); - } - - // Arguments split - const split = "++"; - args = args.join(" ").split(split); - for (let i = 0; i < args.length; i++) args[i] = args[i].trim(); - - let attachment = null; - let sayChannel = null; - if (message.attachments.size > 0) attachment = message.attachments.first(); - - if (!args[1] && !args[2]) { - if (message.deletable) message.delete(); - sayChannel = message.channel; - sayChannel.sendTyping(); - - setTimeout(function () { - if (attachment) sayChannel.send({ - content: args[0], - files: [{ - name: attachment.name, - attachment: attachment.url - }] - }); - else sayChannel.send({ - content: args[0] - }); - }, 2000); - } else if (args[1] && !args[2]) { - if (message.deletable) message.delete(); - sayChannel = message.guild.channels.cache.find(channel => channel.name.includes(args[1]) || channel.id === args[1]); - sayChannel.sendTyping(); - - setTimeout(function () { - if (attachment) sayChannel.send({ - content: args[0], - files: [{ - name: attachment.name, - attachment: attachment.url - }] - }); - else sayChannel.send({ - content: args[0] - }); - }, 2000); - } else if (args[2]) { - if (message.deletable) message.delete(); - sayChannel = this.client.guilds.cache.find(guild => guild.name.includes(args[2]) || guild.id === args[2]).channels.cache.find(channel => channel.name.includes(args[1]) || channel.id === args[1]); - sayChannel.sendTyping(); - - setTimeout(function () { - if (attachment) sayChannel.send({ - content: args[0], - files: [{ - name: attachment.name, - attachment: attachment.url - }] - }); - else sayChannel.send({ - content: args[0] - }); - }, 2000); - } - } -} - -module.exports = Say; \ No newline at end of file diff --git a/commands/Owner/servers-list.js b/commands/Owner/servers-list.js deleted file mode 100644 index ded1680c..00000000 --- a/commands/Owner/servers-list.js +++ /dev/null @@ -1,124 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class ServersList extends Command { - constructor(client) { - super(client, { - name: "servers-list", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["slist"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: true, - cooldown: 3000 - }); - } - - async run(message, args, data) { - let i0 = 0, - i1 = 10, - page = 1; - - let description = `${message.translate("common:SERVERS")}: ${this.client.guilds.cache.size}\n\n` + - this.client.guilds.cache - .sort((a, b) => b.memberCount - a.memberCount) - .map((r) => r) - .map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${message.getNoun(r.memberCount, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}`) - .slice(0, 10) - .join("\n"); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.author.tag, - iconURL: message.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: this.client.user.username - }) - .setTitle(`${message.translate("common:PAGE")}: ${page}/${Math.ceil(this.client.guilds.cache.size / 10)}`) - .setDescription(description); - - const msg = await message.reply({ - embeds: [embed] - }); - - if (message.deletable) message.delete(); - - if (message.channel.type !== "DM") { - await msg.react("⬅"); - await msg.react("➡"); - await msg.react("❌"); - - const filter = (reaction, user) => user.id === message.author.id; - const collector = msg.createReactionCollector({ - filter, - time: 30000 - }); - - collector.on("collect", async (reaction) => { - if (reaction._emoji.name === "⬅") { - i0 = i0 - 10; - i1 = i1 - 10; - page = page - 1; - - if (i0 < 0) return msg.delete(); - if (!i0 || !i1) return msg.delete(); - - description = `${message.translate("common:SERVERS")}: ${this.client.guilds.cache.size}\n\n` + - this.client.guilds.cache - .sort((a, b) => b.memberCount - a.memberCount) - .map((r) => r) - .map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${message.getNoun(r.memberCount, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}`) - .slice(i0, i1) - .join("\n"); - - embed - .setTitle(`${message.translate("common:PAGE")}: ${page}/${Math.round(this.client.guilds.cache.size / 10)}`) - .setDescription(description); - - msg.edit({ - embeds: [embed] - }); - } - - if (reaction._emoji.name === "➡") { - i0 = i0 + 10; - i1 = i1 + 10; - page = page + 1; - - if (i1 > this.client.guilds.cache.size + 10) return msg.delete(); - if (!i0 || !i1) return msg.delete(); - - description = `${message.translate("common:SERVERS")}: ${this.client.guilds.cache.size}\n\n` + - this.client.guilds.cache - .sort((a, b) => b.memberCount - a.memberCount) - .map((r) => r) - .map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${message.getNoun(r.memberCount, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}`) - .slice(i0, i1) - .join("\n"); - - embed.setTitle(`${message.translate("common:PAGE")}: ${page}/${Math.round(this.client.guilds.cache.size / 10)}`) - .setDescription(description); - - msg.edit({ - embeds: [embed] - }); - } - - if (reaction._emoji.name === "❌") return msg.delete(); - - await reaction.users.remove(message.author.id); - }); - } - } -} - -module.exports = ServersList; \ No newline at end of file diff --git a/commands/Ping.js b/commands/Ping.js new file mode 100644 index 00000000..313929cf --- /dev/null +++ b/commands/Ping.js @@ -0,0 +1,34 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const BaseCommand = require("../base/BaseCommand"); + +class Ping extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor() { + super({ + command: new SlashCommandBuilder() + .setName("ping") + .setDescription("Ping command."), // This option is included in type 1. You can configure this option directly with the SlashCommandBuilder feature. + aliases: ["p"], // Application command aliases. + guildOnly: true // Determines whether your command is only guild. + }); + } + /** + * + * @param {import("../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + */ + async execute(client, interaction) { + return interaction.reply({ content: "Pong!", ephemeral: true }); + } +} +module.exports = Ping; \ No newline at end of file diff --git a/commands/Repeat.js b/commands/Repeat.js new file mode 100644 index 00000000..f34472b0 --- /dev/null +++ b/commands/Repeat.js @@ -0,0 +1,37 @@ +const { TextChannel } = require("discord.js"); +const BaseCommand = require("../base/BaseCommand"); + +class Repeat extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor() { + super({ + command: { + name: "repeat", // Application command name. + type: 3 // Type 3 is USER COMMAND. + }, + aliases: ["r"], // Application command aliases. + guildOnly: true // Determines whether your command is only guild. + }); + } + /** + * + * @param {import("../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../base/JaBa")} client + * @param {import("discord.js").ContextMenuInteraction} interaction + */ + async execute(client, interaction) { + const targetChannel = interaction.member.guild.channels.cache.get(interaction.channelId); + const targetMessage = await targetChannel.messages.fetch(interaction.targetId); + return interaction.reply({ content: targetMessage.content, ephemeral: false, fetchReply: true }).then(m => setTimeout(() => m.delete(), 5000)); + } +} +module.exports = Repeat; \ No newline at end of file diff --git a/config.sample.js b/config.sample.js index a377c703..c7e70c7f 100644 --- a/config.sample.js +++ b/config.sample.js @@ -1,8 +1,11 @@ module.exports = { /* The token of your Discord Bot */ token: "XXXXXXXXXXX", + /* ID of Bot's user */ + user: "XXXXXXXXXXX", /* For the support server */ support: { + enabled: false, // Set to false for production id: "XXXXXXXXXXX", // The ID of the support server logs: "XXXXXXXXXXX", // And the ID of the logs channel of your server (new servers for example) }, @@ -17,7 +20,6 @@ module.exports = { failureURL: "https://dashboard.example.com" // url on which users will be redirected if they click the cancel button (discord authentication) }, mongoDB: "mongodb://localhost:27017/discordbot", // The URl of the mongodb database - prefix: "*", // The default prefix for the bot /* For the embeds (embeded messages) */ embed: { color: "#0091fc", // The default color for the embeds @@ -28,18 +30,10 @@ module.exports = { id: "XXXXXXXXXXX", // The ID of the bot's owner name: "@XXXXXXXXXXX#1234" // And the name of the bot's owner }, - /* DBL votes webhook (optional) */ - votes: { - port: 5000, // The port for the server - password: "XXXXXXXXXXX", // The webhook auth that you have defined on discordbots.org - channel: "XXXXXXXXXXX" // The ID of the channel that in you want the votes logs - }, /* The API keys that are required for certain commands */ apiKeys: { // BLAGUE.XYZ: https://blague.xyz/ blagueXYZ: "XXXXXXXXXXX", - // DBL: https://discordbots.org/api/docs#mybots - dbl: "XXXXXXXXXXX", // AMETHYSTE: https://api.amethyste.moe amethyste: "XXXXXXXXXXX" }, diff --git a/dashboard/utils.js b/dashboard/utils.js index c531b84b..12a75c73 100644 --- a/dashboard/utils.js +++ b/dashboard/utils.js @@ -28,14 +28,11 @@ async function fetchUser(userData, client, query) { const userDb = await client.findOrCreateUser({ id: user.id }, true); - // const guildData = await client.guilds.fetch(userData.displayedGuilds[0].id); - // const userPresence = guildData.members.cache.get(user.id).presence; const userInfos = { ...user.toJSON(), ...userDb, ...userData - // ...userPresence }; return userInfos; diff --git a/events/CommandHandler.js b/events/CommandHandler.js new file mode 100644 index 00000000..ab43668d --- /dev/null +++ b/events/CommandHandler.js @@ -0,0 +1,58 @@ +const BaseEvent = require("../base/BaseEvent"); + +class CommandHandler extends BaseEvent { + constructor() { + super({ + name: "interactionCreate", + once: false + }); + } + + /** + * + * @param {import("../base/JaBa")} client + * @param {import("discord.js").Interaction} interaction + */ + async execute(client, interaction) { + if (interaction.type !== "APPLICATION_COMMAND" && !interaction.isCommand()) return; + const command = client.commands.get(interaction.commandName); + const data = []; + + const userData = await client.findOrCreateUser({ + id: interaction.member.id + }); + data.userData = userData; + + if (command.guildOnly && !interaction.inGuild()) return; + + if (interaction.inGuild()) { + const guildData = await client.findOrCreateGuild({ + id: interaction.guildId + }); + data.guildData = guildData; + + const memberData = await client.findOrCreateMember({ + id: interaction.member.id, + guildID: interaction.guildId + }); + data.memberData = memberData; + } + + if (!userData.achievements.firstCommand.achieved) { + userData.achievements.firstCommand.progress.now = 1; + userData.achievements.firstCommand.achieved = true; + userData.markModified("achievements.firstCommand"); + await userData.save(); + await interaction.channel.send({ + files: [{ + name: "achievement_unlocked2.png", + attachment: "./assets/img/achievements/achievement_unlocked2.png" + }] + }); + } + + return command.execute(client, interaction, data); + } +} + +module.exports = CommandHandler; \ No newline at end of file diff --git a/events/guildCreate.js b/events/guildCreate.js index 00b6bce1..e6466a1e 100644 --- a/events/guildCreate.js +++ b/events/guildCreate.js @@ -1,11 +1,19 @@ -const Discord = require("discord.js"); +const { MessageEmbed } = require("discord.js"), + BaseEvent = require("../base/BaseEvent"); -module.exports = class { - constructor(client) { - this.client = client; +class GuildCreate extends BaseEvent { + constructor() { + super({ + name: "guildCreate", + once: false + }); } - async run(guild) { + /** + * + * @param {import("discord.js").Guild} guild + */ + async execute(guild) { const messageOptions = {}; const userData = await this.client.findOrCreateUser({ @@ -23,11 +31,11 @@ module.exports = class { await userData.save(); } - const thanksEmbed = new Discord.MessageEmbed() + const thanksEmbed = new MessageEmbed() .setAuthor({ name: "Спасибо что добавили меня на свой сервер!" }) - .setDescription(`Для настроек используйте \`${this.client.config.prefix}help\` и посмотрите на административные команды!\nЧтобы изменить язык используйте \`${this.client.config.prefix}setlang [язык]\`.`) + .setDescription("Чтобы получить список команд использууйуте `/help` и посмотрите на административные команды!.") .setColor(this.client.config.embed.color) .setFooter({ text: this.client.config.embed.footer @@ -41,7 +49,7 @@ module.exports = class { const users = guild.members.cache.filter((m) => !m.user.bot).size; const bots = guild.members.cache.filter((m) => m.user.bot).size; - const embed = new Discord.MessageEmbed() + const embed = new MessageEmbed() .setAuthor({ name: guild.name, iconURL: guild.iconURL({ @@ -54,4 +62,6 @@ module.exports = class { embeds: [embed] }); } -}; \ No newline at end of file +} + +module.exports = GuildCreate; \ No newline at end of file diff --git a/events/guildDelete.js b/events/guildDelete.js index 63997e60..809bb25b 100644 --- a/events/guildDelete.js +++ b/events/guildDelete.js @@ -1,15 +1,19 @@ -const Discord = require("discord.js"); +const { MessageEmbed } = require("discord.js"), + BaseEvent = require("../base/BaseEvent"); -module.exports = class { - constructor(client) { - this.client = client; +class GuildDelete extends BaseEvent { + constructor() { + super({ + name: "guildDelete", + once: false + }); } - - async run(guild) { - const users = guild.members.cache.filter((m) => !m.user.bot).size; - const bots = guild.members.cache.filter((m) => m.user.bot).size; - - const embed = new Discord.MessageEmbed() + /** + * + * @param {import("discord.js").Guild} guild + */ + async execute(guild) { + const embed = new MessageEmbed() .setAuthor({ name: guild.name, iconURL: guild.iconURL({ @@ -17,9 +21,11 @@ module.exports = class { }) }) .setColor("#B22222") - .setDescription(`Вышел с сервера **${guild.name}**. На нём **${users}** ${this.client.getNoun(users, this.client.translate("misc:NOUNS:USERS:1"), this.client.translate("misc:NOUNS:USERS:2"), this.client.translate("misc:NOUNS:USERS:5"))} (из них **${bots}** ${this.client.getNoun(bots, this.client.translate("misc:NOUNS:BOTS:1"), this.client.translate("misc:NOUNS:BOTS:2"), this.client.translate("misc:NOUNS:BOTS:5"))})`); + .setDescription(`Вышел с сервера **${guild.name}**.`); this.client.channels.cache.get(this.client.config.support.logs).send({ embeds: [embed] }); } -}; \ No newline at end of file +} + +module.exports = GuildDelete; \ No newline at end of file diff --git a/events/guildMemberAdd.js b/events/guildMemberAdd.js index 914e11c6..4349bebc 100644 --- a/events/guildMemberAdd.js +++ b/events/guildMemberAdd.js @@ -1,5 +1,6 @@ const Canvas = require("canvas"), - Discord = require("discord.js"), + BaseEvent = require("../base/BaseEvent"), + { MessageAttachment } = require("discord.js"), { resolve } = require("path"); // Register assets fonts @@ -15,12 +16,19 @@ const applyText = (canvas, text, defaultFontSize, width, font) => { return ctx.font; }; -module.exports = class { - constructor(client) { - this.client = client; +class GuildMemberAdd extends BaseEvent { + constructor() { + super({ + name: "guildMemberAdd", + once: false + }); } - async run(member) { + /** + * + * @param {import("discord.js").GuildMember} member + */ + async execute(member) { if (member.guild && member.guild.id === "568120814776614924") return; await member.guild.members.fetch(); @@ -131,7 +139,7 @@ module.exports = class { })); ctx.drawImage(avatar, 45, 90, 270, 270); - const attachment = new Discord.MessageAttachment(canvas.toBuffer(), "welcome-image.png"); + const attachment = new MessageAttachment(canvas.toBuffer(), "welcome-image.png"); channel.send({ content: message, files: [attachment] @@ -144,4 +152,6 @@ module.exports = class { } } } -}; \ No newline at end of file +} + +module.exports = GuildMemberAdd; \ No newline at end of file diff --git a/events/guildMemberRemove.js b/events/guildMemberRemove.js index a740747f..60760f10 100644 --- a/events/guildMemberRemove.js +++ b/events/guildMemberRemove.js @@ -1,5 +1,6 @@ const Canvas = require("canvas"), - Discord = require("discord.js"), + BaseEvent = require("../base/BaseEvent"), + { MessageAttachment } = require("discord.js"), { resolve } = require("path"); // Register assets fonts @@ -15,12 +16,19 @@ const applyText = (canvas, text, defaultFontSize, width, font) => { return ctx.font; }; -module.exports = class { - constructor(client) { - this.client = client; +class GuildMemberRemove extends BaseEvent { + constructor() { + super({ + name: "guildMemberRemove", + once: false + }); } - async run(member) { + /** + * + * @param {import("discord.js").GuildMember} member + */ + async execute(member) { if (member.guild && member.guild.id === "568120814776614924") return; await member.guild.members.fetch(); @@ -114,7 +122,7 @@ module.exports = class { })); ctx.drawImage(avatar, 45, 90, 270, 270); - const attachment = new Discord.MessageAttachment(canvas.toBuffer(), "goodbye-image.png"); + const attachment = new MessageAttachment(canvas.toBuffer(), "goodbye-image.png"); channel.send({ content: message, files: [attachment] @@ -127,4 +135,6 @@ module.exports = class { } } } -}; \ No newline at end of file +} + +module.exports = GuildMemberRemove; \ No newline at end of file diff --git a/events/guildMemberUpdate.js b/events/guildMemberUpdate.js index 509051dc..54699b86 100644 --- a/events/guildMemberUpdate.js +++ b/events/guildMemberUpdate.js @@ -1,9 +1,19 @@ -module.exports = class { - constructor(client) { - this.client = client; +const BaseEvent = require("../base/BaseEvent"); + +class GuildMemberUpdate extends BaseEvent { + constructor() { + super({ + name: "guildMemberRemove", + once: false + }); } - async run(oldMember, newMember) { + /** + * + * @param {import("discord.js").GuildMember} oldMember + * @param {import("discord.js").GuildMember} newMember + */ + async execute(oldMember, newMember) { if (oldMember.guild && oldMember.guild.id === "568120814776614924") return; if (oldMember.guild.id !== this.client.config.support.id) return; @@ -25,4 +35,6 @@ module.exports = class { }); } } -}; \ No newline at end of file +} + +module.exports = GuildMemberUpdate; \ No newline at end of file diff --git a/events/messageCreate.js b/events/messageCreate.js index c01a06e8..91b70020 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -1,26 +1,32 @@ const { Permissions } = require("discord.js"), xpCooldown = {}, - cmdCooldown = {}; + BaseEvent = require("../base/BaseEvent"); -module.exports = class { - constructor(client) { - this.client = client; +class MessageCreate extends BaseEvent { + constructor() { + super({ + name: "messageCreate", + once: false + }); } - async run(message) { + /** + * + * @param {import("../base/JaBa")} client + * @param {import("discord.js").Message} message + */ + async execute(client, message) { if (message.guild && message.guild.id === "568120814776614924") return; if (message.content.includes("no bitches")) message.reply({ files: [{ name: "b.png", attachment: "./assets/img/b.png" }] }); if (message.content.includes("bitches") && !message.content.includes("no bitches")) message.reply({ files: [{ name: "nob.png", attachment: "./assets/img/nob.png" }] }); const data = {}; + data.config = client.config; if (message.author.bot) return; if (message.guild && !message.member) await message.guild.members.fetch(message.author.id); - const client = this.client; - data.config = client.config; - if (message.guild) { const guild = await client.findOrCreateGuild({ id: message.guild.id @@ -28,10 +34,7 @@ module.exports = class { message.guild.data = data.guild = guild; } - if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) { - if (message.guild) return message.sendT("misc:HELLO_SERVER", { username: message.author.username, prefix: data.guild.prefix }); - else return message.sendT("misc:HELLO_DM"); - } + if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) return message.sendT("misc:HELLO_SERVER", { username: message.author.username }); if (message.guild) { const memberData = await client.findOrCreateMember({ @@ -49,31 +52,6 @@ module.exports = class { if (message.guild) { await updateXp(client, message, data); - if (!message.channel.permissionsFor(message.member).has(Permissions.FLAGS.MANAGE_MESSAGES) && !message.editedAt) { - const channelSlowmode = data.guild.slowmode.channels.find((ch) => ch.id === message.channel.id); - if (channelSlowmode) { - const uSlowmode = data.guild.slowmode.users.find((d) => d.id === (message.author.id + message.channel.id)); - if (uSlowmode) { - if (uSlowmode.time > Date.now()) { - message.delete(); - return message.author.send(message.translate("administration/slowmode:PLEASE_WAIT", { - time: message.convertTime(uSlowmode.time, "to", true), - channel: message.channel.toString() - })); - } else { - uSlowmode.time = channelSlowmode.time + Date.now(); - } - } else { - data.guild.slowmode.users.push({ - id: message.author.id + message.channel.id, - time: channelSlowmode.time + Date.now() - }); - } - data.guild.markModified("slowmode.users"); - await data.guild.save(); - } - } - if (data.guild.plugins.automod.enabled && !data.guild.plugins.automod.ignored.includes(message.channel.id)) { if (/(discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\/.+)/i.test(message.content)) { if (!message.channel.permissionsFor(message.member).has(Permissions.FLAGS.MANAGE_MESSAGES)) { @@ -102,109 +80,9 @@ module.exports = class { if (userData.afk) message.error("general/setafk:IS_AFK", { user: u.tag, reason: userData.afk }); }); } - - const prefix = client.functions.getPrefix(message, data); - if (!prefix) return; - - const args = message.content.slice((typeof prefix === "string" ? prefix.length : 0)).trim().split(/ +/g); - const command = args.shift().toLowerCase(); - const cmd = client.commands.get(command) || client.commands.get(client.aliases.get(command)); - - const customCommand = message.guild ? data.guild.customCommands.find((c) => c.name === command) : null; - const customCommandAnswer = customCommand ? customCommand.answer : ""; - - if (!cmd && !customCommandAnswer && message.guild) return; - else if (!cmd && !customCommandAnswer && !message.guild) return message.sendT("misc:HELLO_DM"); - - if (message.guild && data.guild.ignoredChannels.includes(message.channel.id) && !message.member.permissions.has(Permissions.FLAGS.MANAGE_MESSAGES)) { - message.delete(); - return message.author.send(message.translate("misc:RESTRICTED_CHANNEL", { - channel: message.channel.toString() - })); - } - - if (customCommandAnswer) return message.channel.send({ content: customCommandAnswer.replace("{user}", message.author).replace("{guild}", message.guild) }); - if (cmd.conf.guildOnly && !message.guild) return message.error("misc:GUILD_ONLY"); - - if (message.guild) { - let neededPermissions = []; - if (!cmd.conf.botPermissions.includes("EMBED_LINKS")) cmd.conf.botPermissions.push("EMBED_LINKS"); - - cmd.conf.botPermissions.forEach((perm) => { - if (!message.channel.permissionsFor(message.guild.me).has(perm)) neededPermissions.push(perm); - }); - - if (neededPermissions.length > 0) return message.error("misc:MISSING_BOT_PERMS", { list: neededPermissions.map((p) => `\`${p}\``).join(", ") }); - - neededPermissions = []; - cmd.conf.memberPermissions.forEach((perm) => { - if (!message.channel.permissionsFor(message.member).has(perm)) neededPermissions.push(perm); - }); - - if (neededPermissions.length > 0) return message.error("misc:MISSING_MEMBER_PERMS", { list: neededPermissions.map((p) => `\`${message.translate(`misc:PERMISSIONS:${p}`)}\``).join(", ") }); - if (!message.channel.permissionsFor(message.member).has(Permissions.FLAGS.MENTION_EVERYONE) && (message.content.includes("@everyone") || message.content.includes("@here"))) return message.error("misc:EVERYONE_MENTION"); - if (!message.channel.nsfw && cmd.conf.nsfw) return message.error("misc:NSFW_COMMAND"); - } - - if (!cmd.conf.enabled) return message.error("misc:COMMAND_DISABLED"); - if (cmd.conf.ownerOnly && message.author.id !== client.config.owner.id) return message.error("misc:OWNER_ONLY"); - - let uCooldown = cmdCooldown[message.author.id]; - if (!uCooldown) { - cmdCooldown[message.author.id] = {}; - uCooldown = cmdCooldown[message.author.id]; - } - - const time = uCooldown[cmd.help.name] || 0; - if (time && (time > Date.now())) { - const seconds = Math.ceil((time - Date.now()) / 1000); - return message.error("misc:COOLDOWNED", { seconds: `${seconds} ${client.getNoun(seconds, message.translate("misc:NOUNS:SECONDS:1"), message.translate("misc:NOUNS:SECONDS:2"), message.translate("misc:NOUNS:SECONDS:5"))}` }); - } - - cmdCooldown[message.author.id][cmd.help.name] = Date.now() + cmd.conf.cooldown; - - client.logger.log(`${message.author.username} (${message.author.id}) ran command ${cmd.help.name} ${message.guild ? `on ${message.guild.name}` : "in DM"}`, "cmd"); - - const log = new this.client.logs({ - commandName: cmd.help.name, - author: { - username: message.author.username, - discriminator: message.author.discriminator, - id: message.author.id - }, - guild: { - name: message.guild ? message.guild.name : "dm", - id: message.guild ? message.guild.id : "dm" - } - }); - log.save(); - - if (!data.userData.achievements.firstCommand.achieved) { - data.userData.achievements.firstCommand.progress.now = 1; - data.userData.achievements.firstCommand.achieved = true; - data.userData.markModified("achievements.firstCommand"); - await data.userData.save(); - await message.reply({ - files: [{ - name: "achievement_unlocked2.png", - attachment: "./assets/img/achievements/achievement_unlocked2.png" - }] - }); - } - - try { - cmd.run(message, args, data); - if (cmd.help.category === "Moderation" && data.guild.autoDeleteModCommands) { - setTimeout(() => { - if (message.deletable) message.delete(); - }, 3000); - } - } catch (e) { - console.error(e); - return message.error("misc:ERR_OCCURRED"); - } + return; } -}; +} async function updateXp(client, msg, data) { const points = parseInt(data.memberData.exp); @@ -225,4 +103,6 @@ async function updateXp(client, msg, data) { data.memberData.exp = parseInt(newXp, 10); await data.memberData.save(); -} \ No newline at end of file +} + +module.exports = MessageCreate; \ No newline at end of file diff --git a/events/messageUpdate.js b/events/messageUpdate.js deleted file mode 100644 index 4c876a82..00000000 --- a/events/messageUpdate.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = class { - constructor(client) { - this.client = client; - } - - async run(oldMessage, newMessage) { - if (!newMessage.editedAt) return; - this.client.emit("messageCreate", newMessage); - } -}; \ No newline at end of file diff --git a/events/ready.js b/events/ready.js index 60a71937..4a23594e 100644 --- a/events/ready.js +++ b/events/ready.js @@ -1,18 +1,25 @@ -const { Permissions } = require("discord.js"); +const BaseEvent = require("../base/BaseEvent"), + { Permissions } = require("discord.js"); -module.exports = class { - constructor(client) { - this.client = client; +class Ready extends BaseEvent { + constructor() { + super({ + name: "ready", + once: false + }); } - - async run() { - const client = this.client; + /** + * + * @param {import("../base/JaBa")} client + */ + async execute(client) { + const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()]; let hiddenGuild = await client.guilds.fetch("568120814776614924"); let tUsers = client.users.cache.size - hiddenGuild.memberCount; let tServers = client.guilds.cache.size - 1; // Logs some informations using logger - client.logger.log(`Loading a total of ${client.commands.size} command(s).`, "log"); + client.logger.log(`Loaded a total of ${commands.length} command(s).`, "log"); client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready"); client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [Permissions.FLAGS.ADMINISTRATOR] })}`, "ready"); @@ -24,10 +31,6 @@ module.exports = class { const birthdays = require("../helpers/birthdays"); birthdays.init(client); - // DiscordBots.org STATS - const discordbotsorg = require("../helpers/discordbots.org"); - discordbotsorg.init(client); - // Unmute users const checkUnmutes = require("../helpers/checkUnmutes"); checkUnmutes.init(client); @@ -47,7 +50,7 @@ module.exports = class { const version = require("../package.json").version; const status = [ { name: "help", type: "LISTENING" }, - { name: `${client.commands.size} ${client.getNoun(client.commands.size, client.translate("misc:NOUNS:COMMANDS:1"), client.translate("misc:NOUNS:COMMANDS:2"), client.translate("misc:NOUNS:COMMANDS:5"))}`, type: "LISTENING"}, + { name: `${commands.length} ${client.getNoun(commands.length, client.translate("misc:NOUNS:COMMANDS:1"), client.translate("misc:NOUNS:COMMANDS:2"), client.translate("misc:NOUNS:COMMANDS:5"))}`, type: "LISTENING"}, { name: `${tServers} ${client.getNoun(tServers, client.translate("misc:NOUNS:SERVER:1"), client.translate("misc:NOUNS:SERVER:2"), client.translate("misc:NOUNS:SERVER:5"))}`, type: "WATCHING" }, { name: `${tUsers} ${client.getNoun(tUsers, client.translate("misc:NOUNS:USERS:1"), client.translate("misc:NOUNS:USERS:2"), client.translate("misc:NOUNS:USERS:5"))}`, type: "WATCHING" } ]; @@ -65,6 +68,8 @@ module.exports = class { if (status[parseInt(i + 1, 10)]) i++; else i = 0; - }, 20000); // Every 20 seconds + }, 10 * 1000); // Every 10 seconds } -}; \ No newline at end of file +} + +module.exports = Ready; \ No newline at end of file diff --git a/helpers/discordbots.org.js b/helpers/discordbots.org.js deleted file mode 100644 index 3f7f7ae9..00000000 --- a/helpers/discordbots.org.js +++ /dev/null @@ -1,41 +0,0 @@ -const DBL = require("dblapi.js"); - -/* THIS POSTS STATS TO DISCORDBOTS.ORG */ -module.exports = { - /** - * Starts to post stats to DBL - * @param {object} client The Discord Client instance - */ - init(client) { - if (client.config.apiKeys.dbl && client.config.apiKeys.dbl !== "") { - const stats = new DBL(client.config.apiKeys.dbl, client); - setInterval(function () { - stats.postStats(client.guilds.cache.size); - }, 10 * 60000); // every 10 minutes - const dbl = new DBL(client.config.apiKeys.dbl, { - webhookPort: client.config.votes.port, - webhookAuth: client.config.votes.password - }); - dbl.webhook.on("vote", async (vote) => { - const dUser = await client.users.fetch(vote.user); - const member = await client.findOrCreateMember({ - id: vote.user, - guildID: client.config.support.id - }); - member.money = member.money + 50; - member.save(); - dUser.send(client.translate("misc:VOTE_DM", { - user: dUser.tag - })).catch(() => {}); - const logsChannel = client.channels.cache.get(client.config.votes.channel); - - if (logsChannel) logsChannel.send({ - content: client.translate("misc:VOTE_LOGS", { - userid: dUser.id, - usertag: dUser.tag - }) - }); - }); - } - } -}; \ No newline at end of file diff --git a/helpers/extenders.js b/helpers/extenders.js index 91e6b540..46c372bf 100644 --- a/helpers/extenders.js +++ b/helpers/extenders.js @@ -1,8 +1,7 @@ -const { Guild, Message, MessageEmbed } = require("discord.js"); -const config = require("../config"); +const { Guild, Message } = require("discord.js"); Guild.prototype.translate = function (key, args) { - const language = this.client.translations.get(this.data.language); + const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); if (!language) throw "Message: Invalid language set in data."; return language(key, args); @@ -50,22 +49,4 @@ Message.prototype.convertTime = function (time, type, noPrefix) { Message.prototype.getNoun = function (number, one, two, five) { return this.client.getNoun(number, one, two, five); -}; - -MessageEmbed.prototype.errorColor = function () { - this.setColor("#FF0000"); - - return this; -}; - -MessageEmbed.prototype.successColor = function () { - this.setColor("#32CD32"); - - return this; -}; - -MessageEmbed.prototype.defaultColor = function () { - this.setColor(config.color); - - return this; }; \ No newline at end of file diff --git a/index.js b/index.js index ed1eb7e5..f5aadc0c 100644 --- a/index.js +++ b/index.js @@ -1,74 +1,21 @@ require("./helpers/extenders"); -const util = require("util"), - fs = require("fs"), - readdir = util.promisify(fs.readdir), - mongoose = require("mongoose"), - { Intents } = require("discord.js"); +const { Intents } = require("discord.js"), + JaBa = require("./base/JaBa"); -// Load JaBa class -const JaBa = require("./base/JaBa"); const client = new JaBa({ - intents: [ - Intents.FLAGS.GUILDS, - Intents.FLAGS.GUILD_MEMBERS, - Intents.FLAGS.GUILD_BANS, - Intents.FLAGS.GUILD_EMOJIS_AND_STICKERS, - Intents.FLAGS.GUILD_INVITES, - Intents.FLAGS.GUILD_VOICE_STATES, - Intents.FLAGS.GUILD_PRESENCES, - Intents.FLAGS.GUILD_MESSAGES, - Intents.FLAGS.GUILD_MESSAGE_REACTIONS, - Intents.FLAGS.GUILD_MESSAGE_TYPING, - Intents.FLAGS.DIRECT_MESSAGES, - ], - partials: ["CHANNEL"] + intents: Object.keys(Intents.FLAGS), + allowedMentions: { parse: ["everyone", "roles", "users"] } }); -const init = async () => { - const directories = await readdir("./commands/"); - client.logger.log(`Loading a total of ${directories.length} categories.`, "log"); - directories.forEach(async (dir) => { - const commands = await readdir(`./commands/${dir}/`); - commands.filter((cmd) => cmd.split(".").pop() === "js").forEach((cmd) => { - const response = client.loadCommand(`./commands/${dir}`, cmd); - if (response) client.logger.log(response, "error"); - }); - }); - - const evtFiles = await readdir("./events/"); - client.logger.log(`Loading a total of ${evtFiles.length} events.`, "log"); - evtFiles.forEach((file) => { - const eventName = file.split(".")[0]; - client.logger.log(`Loading Event: ${eventName}`); - const event = new(require(`./events/${file}`))(client); - client.on(eventName, (...args) => event.run(...args)); - delete require.cache[require.resolve(`./events/${file}`)]; - }); - - client.login(client.config.token); - - mongoose.connect(client.config.mongoDB, { - useNewUrlParser: true, - useUnifiedTopology: true - }).then(() => { - client.logger.log("Connected to the Mongodb database.", "log"); - }).catch((err) => { - client.logger.log(`Unable to connect to the Mongodb database. Error: ${err}`, "error"); - }); - - const languages = require("./helpers/languages"); - client.translations = await languages(); - - const autoUpdateDocs = require("./helpers/autoUpdateDocs"); - autoUpdateDocs.update(client); -}; - -init(); +(async () => { + await client.loadEvents("../events"); + await client.loadCommands("../commands", client.config.support.enabled ? client.config.support.id : ""); + await client.init(); +})(); client.on("disconnect", () => client.logger.log("Bot is disconnecting...", "warn")) .on("reconnecting", () => client.logger.log("Bot reconnecting...", "log")) .on("error", (e) => client.logger.log(e, "error")) .on("warn", (info) => client.logger.log(info, "warn")); - process.on("unhandledRejection", (err) => console.error(err)); \ No newline at end of file diff --git a/languages/en-US/administration/slowmode.json b/languages/en-US/administration/slowmode.json deleted file mode 100644 index 46723a8b..00000000 --- a/languages/en-US/administration/slowmode.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Set a channel cooldown", - "USAGE": "{{prefix}}slowmode [#channel] (time)", - "EXAMPLES": "{{prefix}}slowmode #general 10m\n{{prefix}}slowmode #general", - "DISABLED": "**Slow-mode has just been disabled in {{channel}}!**\n\n:arrow_right_hook: *Send `{{prefix}}slowmode [#channel] (time)` to enable it again!*", - "ENABLED": "**A slow-mode of `{{time}}` has just been enabled in `{{channel}}`!**\n\n:arrow_right_hook: *Send `{{prefix}}slowmode {{channel}}` to disable it!*", - "PLEASE_WAIT": "Channel {{channel}} is in slowmode! Please wait {{time}} between each message!" -} \ No newline at end of file diff --git a/languages/language-meta.json b/languages/language-meta.json index 00f92daa..b61bcd66 100644 --- a/languages/language-meta.json +++ b/languages/language-meta.json @@ -4,27 +4,12 @@ "nativeName": "Русский", "moment": "ru", "defaultMomentFormat": "Do MMMM YYYY", - "default": true, - "aliases": [ - "Русский", - "ru", - "ru-ru", - "ru_ru", - "ru_RU" - ] + "default": true }, { "name": "uk-UA", "nativeName": "Українська", "moment": "uk", - "defaultMomentFormat": "Do MMMM YYYY", - "default": false, - "aliases": [ - "Украинский", - "uk", - "uk-ua", - "uk_ua", - "uk_UA" - ] + "defaultMomentFormat": "Do MMMM YYYY" } ] \ No newline at end of file diff --git a/languages/ru-RU/administration/slowmode.json b/languages/ru-RU/administration/slowmode.json deleted file mode 100644 index c97e8942..00000000 --- a/languages/ru-RU/administration/slowmode.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Включить медленный режим в канале", - "USAGE": "{{prefix}}slowmode [#канал] (время)", - "EXAMPLES": "{{prefix}}slowmode #основной 10m\n{{prefix}}slowmode #основной", - "DISABLED": "**Медленный режим был выключен в канале {{channel}}!**\n\n:arrow_right_hook: *Отправьте `{{prefix}}slowmode [#канал] (время)`, чтобы снова включить медленный режим!*", - "ENABLED": "**Медленный режим в `{{time}}` установлен в канале `{{channel}}`!**\n\n:arrow_right_hook: *Отправьте `{{prefix}}slowmode {{channel}}`, чтобы отключить!*", - "PLEASE_WAIT": "В канале {{channel}} включён медленный режим! Подождите {{time}} перед отправкой следующего сообщения!" -} \ No newline at end of file diff --git a/languages/ru-RU/misc.json b/languages/ru-RU/misc.json index 209d395c..4a249aae 100644 --- a/languages/ru-RU/misc.json +++ b/languages/ru-RU/misc.json @@ -17,8 +17,7 @@ "NO_USER_FOUND_ID": "Пользователя с ID `{{id}}` не существует!", "VOTE_DM": "⬆️ Привет, {{user}}, спасибо за голос!\nТвоя награда - 50 кредитов (на сервере поддержки)!", "VOTE_LOGS": "⬆️ **{{usertag}}** (`{{userid}}`) проголосовал за **JaBa** и получил **50** кредитов, спасибо!\n", - "HELLO_SERVER": "Привет, **{{username}}**, мой префикс на данном сервере - `{{prefix}}`. Используйте `{{prefix}}help`, чтобы получить список команд!", - "HELLO_DM": "Привет, так как вы пишите в ЛС, вам не нужно использовать префикс.", + "HELLO_SERVER": "Привет, **{{username}}**! Все мои команды доступны через **/** Используйте `/help`, чтобы получить список команд!", "GUILD_ONLY": "Данную команду можно использовать только на сервере!", "MISSING_BOT_PERMS": "Мне необходимы следующие права для выполнения данной команды: {{list}}", "MISSING_MEMBER_PERMS": "Вам необходимы следующие права для выполнения данной команды: {{list}}", diff --git a/languages/ru-RU/music/createplaylist.json b/languages/ru-RU/music/createplaylist.json deleted file mode 100644 index 2b8d3595..00000000 --- a/languages/ru-RU/music/createplaylist.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Создать плейлист", - "USAGE": "{{prefix}}createplaylist [название] | [ссылки на треки/трансляции]", - "EXAMPLES": "{{prefix}}createplaylist Мой крутой плейлист | https://www.youtube.com/watch?v=dQw4w9WgXcQ https://www.youtube.com/watch?v=MEg-oqI9qmw", - "NO_NAME": "Укажите название плейлиста!", - "NO_SONGS": "Укажите ссылки(у) на треки/трансляции!", - "CREATED": "Плейлист `{{name}}` сохранён!" -} \ No newline at end of file diff --git a/languages/ru-RU/music/playlists.json b/languages/ru-RU/music/playlists.json deleted file mode 100644 index 8f12b606..00000000 --- a/languages/ru-RU/music/playlists.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "DESCRIPTION": "Посмотреть список ваших плейлистов", - "USAGE": "{{prefix}}playlists (название)", - "EXAMPLES": "{{prefix}}playlists\n{{prefix}}playlists Мой крутой плейлист", - "EMBED_TITLE": "Список плейлистов", - "EMBED_TITLE2": "Плейлист \"{{name}}\"", - "NO_PLAYLISTS": "У вас нет плейлистов!", - "PLAYLISTS": "Плейлисты", - "NAME": "Название", - "COUNT": "Количество треков", - "SONGS": "Треки в плейлисте" -} \ No newline at end of file diff --git a/languages/ru-RU/music/playplaylist.json b/languages/ru-RU/music/playplaylist.json deleted file mode 100644 index 2d62ae0d..00000000 --- a/languages/ru-RU/music/playplaylist.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Воспроизвести плейлист", - "USAGE": "{{prefix}}playplaylist [название]", - "EXAMPLES": "{{prefix}}playplaylist Мой крутой плейлист" -} \ No newline at end of file diff --git a/languages/ru-RU/music/removeplaylist.json b/languages/ru-RU/music/removeplaylist.json deleted file mode 100644 index 244a39c1..00000000 --- a/languages/ru-RU/music/removeplaylist.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Удалить плейлист", - "USAGE": "{{prefix}}removeplaylist [название]", - "EXAMPLES": "{{prefix}}removeplaylist Мой крутой плейлист", - "NO_NAME": "Укажите название плейлиста!", - "REMOVED": "Плейлист `{{name}}` удалён!", - "NOT_FOUND": "Плейлист `{{name}}` не найден!" -} \ No newline at end of file diff --git a/languages/uk-UA/administration/slowmode.json b/languages/uk-UA/administration/slowmode.json deleted file mode 100644 index a1541abe..00000000 --- a/languages/uk-UA/administration/slowmode.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Увімкнути повільний режим у каналі", - "USAGE": "{{prefix}}slowmode [#канал] (час)", - "EXAMPLES": "{{prefix}}slowmode #основний 10m\n{{prefix}}slowmode #основний", - "DISABLED": "**Повільний режим був вимкнений у {{channel}}!**\n\n:arrow_right_hook: *Надіслати `{{prefix}}slowmode [#канал] (час)`, щоб знову ввімкнути повільний режим!*", - "ENABLED": "**Повільний режим в `{{time}}` встановлений у каналі `{{channel}}`!**\n\n:arrow_right_hook: *Надішліть `{{prefix}}slowmode {{channel} }`, щоб вимкнути!*", - "PLEASE_WAIT": "У {{channel}} увімкнено повільний режим! Зачекайте {{time}} перед надсиланням наступного повідомлення!" -} \ No newline at end of file diff --git a/languages/uk-UA/music/createplaylist.json b/languages/uk-UA/music/createplaylist.json deleted file mode 100644 index aa597752..00000000 --- a/languages/uk-UA/music/createplaylist.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Створити плейлист", - "USAGE": "{{prefix}}createplaylist [назва] | [посилання на треки/трансляції]", - "EXAMPLES": "{{prefix}}createplaylist Мій крутий плейлист | https://www.youtube.com/watch?v=dQw4w9WgXcQ https://www.youtube.com/watch?v=MEg-oqI9qmw", - "NO_NAME": "Вкажіть назву плейлиста!", - "NO_SONGS": "Вкажіть посилання на треки/трансляції!", - "CREATED": "Плейлист `{{name}}` збережений!" -} \ No newline at end of file diff --git a/languages/uk-UA/music/playlists.json b/languages/uk-UA/music/playlists.json deleted file mode 100644 index 3f86fb20..00000000 --- a/languages/uk-UA/music/playlists.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "DESCRIPTION": "Подивитися список ваших плейлистів", - "USAGE": "{{prefix}}playlists (назва)", - "EXAMPLES": "{{prefix}}playlists\n{{prefix}}playlists Мій крутий плейлист", - "EMBED_TITLE": "Список плейлистів", - "EMBED_TITLE2": "Плейлист \"{{name}}\"", - "NO_PLAYLISTS": "У вас немає плейлистів!", - "PLAYLISTS": "Плейлисти", - "NAME": "Назва", - "COUNT": "Кількість треків", - "SONGS": "Треки в плейлисті" -} \ No newline at end of file diff --git a/languages/uk-UA/music/playplaylist.json b/languages/uk-UA/music/playplaylist.json deleted file mode 100644 index 0442201c..00000000 --- a/languages/uk-UA/music/playplaylist.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Відтворити плейлист", - "USAGE": "{{prefix}}playplaylist [назва]", - "EXAMPLES": "{{prefix}}playplaylist Мій крутий плейлист" -} \ No newline at end of file diff --git a/languages/uk-UA/music/removeplaylist.json b/languages/uk-UA/music/removeplaylist.json deleted file mode 100644 index d10fabbb..00000000 --- a/languages/uk-UA/music/removeplaylist.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Видалити плейлист", - "USAGE": "{{prefix}}removeplaylist [назва]", - "EXAMPLES": "{{prefix}}removeplaylist Мій крутий плейлист", - "NO_NAME": "Вкажіть назву плейлиста!", - "REMOVED": "Плейлист `{{name}}` видалений!", - "NOT_FOUND": "Плейлист `{{name}}` не знайдено!" -} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 8629d2a7..beeda0de 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,17 @@ { "name": "jaba", - "version": "4.0", + "version": "TEST", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jaba", - "version": "4.0", + "version": "TEST", "license": "ISC", "dependencies": { + "@discordjs/builders": "^1.0.0", "@discordjs/opus": "^0.7.0", + "@discordjs/rest": "^1.0.0", "@discordjs/voice": "^0.10.0", "@distube/soundcloud": "^1.2.1", "@distube/spotify": "^1.3.2", @@ -25,11 +27,12 @@ "colors-generator": "^0.3.4", "cron": "^1.7.2", "dblapi.js": "^2.3.0", + "discord-api-types": "^0.36.3", "discord-backup": "^3.2.1", "discord-giveaways": "github:Androz2091/discord-giveaways#develop", "discord-paginationembed": "github:gazmull/discord-paginationembed#v3", "discord-together": "^1.3.3", - "discord.js": "^13.8.0", + "discord.js": "^13.8.1", "distube": "^3.3.4", "ejs": "^3.1.3", "express": "^4.17.1", @@ -41,7 +44,6 @@ "i18next-node-fs-backend": "^2.1.3", "js-string-cleaner": "^1.0.3", "libsodium-wrappers": "^0.7.9", - "lyrics-finder": "^21.7.0", "markdown-table": "2.0.0", "mathjs": "^9.0.0", "md5": "^2.2.1", @@ -196,13 +198,12 @@ } }, "node_modules/@discordjs/builders": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", - "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.0.0.tgz", + "integrity": "sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==", "dependencies": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" @@ -251,6 +252,31 @@ "node": ">=12.0.0" } }, + "node_modules/@discordjs/rest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.0.tgz", + "integrity": "sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==", + "dependencies": { + "@discordjs/collection": "^1.0.0", + "@sapphire/async-queue": "^1.3.2", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.36.2", + "file-type": "^17.1.2", + "tslib": "^2.4.0", + "undici": "^5.7.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.0.tgz", + "integrity": "sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q==", + "engines": { + "node": ">=16.9.0" + } + }, "node_modules/@discordjs/voice": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.10.0.tgz", @@ -267,6 +293,11 @@ "node": ">=16.9.0" } }, + "node_modules/@discordjs/voice/node_modules/discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + }, "node_modules/@distube/soundcloud": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@distube/soundcloud/-/soundcloud-1.2.1.tgz", @@ -436,20 +467,33 @@ } }, "node_modules/@sapphire/async-queue": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", - "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.2.tgz", + "integrity": "sha512-rUpMLATsoAMnlN3gecAcr9Ecnw1vG7zi5Xr+IX22YzRzi1k9PF9vKzoT8RuEJbiIszjcimu3rveqUnvwDopz8g==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" } }, "node_modules/@sapphire/shapeshift": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.1.0.tgz", - "integrity": "sha512-PkxFXd3QJ1qAPS05Dy2UkVGYPm/asF1Ugt2Xyzmv4DHzO3+G7l+873C4XFFcJ9M5Je+eCMC7SSifgPTSur5QuA==", + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.5.1.tgz", + "integrity": "sha512-7JFsW5IglyOIUQI1eE0g6h06D/Far6HqpcowRScgCiLSqTf3hhkPWCWotVTtVycnDCMYIwPeaw6IEPBomKC8pA==", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + }, "engines": { - "node": ">=v15.0.0", + "node": ">=v14.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/@sapphire/snowflake": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.2.tgz", + "integrity": "sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ==", + "engines": { + "node": ">=v14.0.0", "npm": ">=7.0.0" } }, @@ -513,6 +557,11 @@ "node": ">=10" } }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, "node_modules/@types/bson": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", @@ -1413,9 +1462,9 @@ } }, "node_modules/discord-api-types": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.4.tgz", - "integrity": "sha512-Y6RMvXsHKiBgQhm/q5MgRieXc4Tzh5p/JuDyqreI48lmy+AQfO+g9Xhz0tuGBaN1FtsrLT7mD+lbFONPo5vdwA==" + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" }, "node_modules/discord-backup": { "version": "3.2.1", @@ -1459,9 +1508,10 @@ } }, "node_modules/discord.js": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.0.tgz", - "integrity": "sha512-EPAA/2VLycYN5wSzavqa4iJ6qj3UtQFtHw5TH/60Fj29ymfEsCQVn//o1mTpwDxzwb+rPIrWhkxKIGGnjfv0Iw==", + "version": "13.8.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", + "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", + "deprecated": "no longer supported", "dependencies": { "@discordjs/builders": "^0.14.0", "@discordjs/collection": "^0.7.0", @@ -1478,6 +1528,28 @@ "npm": ">=7.0.0" } }, + "node_modules/discord.js/node_modules/@discordjs/builders": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", + "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "deprecated": "no longer supported", + "dependencies": { + "@sapphire/shapeshift": "^3.1.0", + "@sindresorhus/is": "^4.6.0", + "discord-api-types": "^0.33.3", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + }, "node_modules/distube": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/distube/-/distube-3.3.4.tgz", @@ -1606,6 +1678,8 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -1614,6 +1688,8 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -2061,6 +2137,22 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-type": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.3.tgz", + "integrity": "sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.7", + "token-types": "^5.0.0-alpha.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/filelist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", @@ -2493,117 +2585,11 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "bin": { - "he": "bin/he" - } - }, "node_modules/himalaya": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" }, - "node_modules/html-to-text": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", - "dependencies": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - }, - "bin": { - "html-to-text": "bin/cli.js" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/html-to-text/node_modules/dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "dependencies": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - } - }, - "node_modules/html-to-text/node_modules/dom-serializer/node_modules/domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/html-to-text/node_modules/dom-serializer/node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/html-to-text/node_modules/domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "node_modules/html-to-text/node_modules/domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/html-to-text/node_modules/domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "dependencies": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "node_modules/html-to-text/node_modules/entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "node_modules/html-to-text/node_modules/htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "dependencies": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "node_modules/html-to-text/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -2728,6 +2714,25 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -3036,11 +3041,6 @@ "libsodium": "^0.7.0" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -3057,6 +3057,11 @@ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, + "node_modules/lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, "node_modules/long": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", @@ -3081,19 +3086,6 @@ "node": ">=10" } }, - "node_modules/lyrics-finder": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", - "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", - "dependencies": { - "encoding": "^0.1.13", - "html-to-text": "^5.1.1", - "node-fetch": "^2.6.0" - }, - "bin": { - "lyrics-finder": "src/bin.js" - } - }, "node_modules/m3u8stream": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", @@ -3751,6 +3743,18 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "node_modules/peek-readable": { + "version": "5.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0-alpha.5.tgz", + "integrity": "sha512-pJohF/tDwV3ntnT5+EkUo4E700q/j/OCDuPxtM+5/kFGjyOai/sK4/We4Cy1MB2OiTQliWU5DxPvYIKQAdPqAA==", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -3907,6 +3911,34 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/readable-web-to-node-stream/node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -4377,6 +4409,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strtok3": { + "version": "7.0.0-alpha.8", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.8.tgz", + "integrity": "sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0-alpha.5" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/superagent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", @@ -4525,6 +4573,22 @@ "node": ">=0.6" } }, + "node_modules/token-types": { + "version": "5.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.0-alpha.2.tgz", + "integrity": "sha512-EsG9UxAW4M6VATrEEjhPFTKEUi1OiJqTUMIZOGBN49fGxYjZB36k0p7to3HZSmWRoHm1QfZgrg3e02fpqAt5fQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -4882,13 +4946,12 @@ } }, "@discordjs/builders": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", - "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.0.0.tgz", + "integrity": "sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==", "requires": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" @@ -4924,6 +4987,27 @@ "node-addon-api": "^4.2.0" } }, + "@discordjs/rest": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.0.tgz", + "integrity": "sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==", + "requires": { + "@discordjs/collection": "^1.0.0", + "@sapphire/async-queue": "^1.3.2", + "@sapphire/snowflake": "^3.2.2", + "discord-api-types": "^0.36.2", + "file-type": "^17.1.2", + "tslib": "^2.4.0", + "undici": "^5.7.0" + }, + "dependencies": { + "@discordjs/collection": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.0.tgz", + "integrity": "sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q==" + } + } + }, "@discordjs/voice": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.10.0.tgz", @@ -4935,6 +5019,13 @@ "tiny-typed-emitter": "^2.1.0", "tslib": "^2.4.0", "ws": "^8.7.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + } } }, "@distube/soundcloud": { @@ -5066,14 +5157,23 @@ } }, "@sapphire/async-queue": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.1.tgz", - "integrity": "sha512-FFTlPOWZX1kDj9xCAsRzH5xEJfawg1lNoYAA+ecOWJMHOfiZYb1uXOI3ne9U4UILSEPwfE68p3T9wUHwIQfR0g==" + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.3.2.tgz", + "integrity": "sha512-rUpMLATsoAMnlN3gecAcr9Ecnw1vG7zi5Xr+IX22YzRzi1k9PF9vKzoT8RuEJbiIszjcimu3rveqUnvwDopz8g==" }, "@sapphire/shapeshift": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.1.0.tgz", - "integrity": "sha512-PkxFXd3QJ1qAPS05Dy2UkVGYPm/asF1Ugt2Xyzmv4DHzO3+G7l+873C4XFFcJ9M5Je+eCMC7SSifgPTSur5QuA==" + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.5.1.tgz", + "integrity": "sha512-7JFsW5IglyOIUQI1eE0g6h06D/Far6HqpcowRScgCiLSqTf3hhkPWCWotVTtVycnDCMYIwPeaw6IEPBomKC8pA==", + "requires": { + "fast-deep-equal": "^3.1.3", + "lodash.uniqwith": "^4.5.0" + } + }, + "@sapphire/snowflake": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.2.2.tgz", + "integrity": "sha512-ula2O0kpSZtX9rKXNeQMrHwNd7E4jPDJYUXmEGTFdMRfyfMw+FPyh04oKMjAiDuOi64bYgVkOV3MjK+loImFhQ==" }, "@sindresorhus/is": { "version": "4.6.0", @@ -5113,6 +5213,11 @@ "defer-to-connect": "^2.0.0" } }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, "@types/bson": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", @@ -5827,9 +5932,9 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "discord-api-types": { - "version": "0.33.4", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.4.tgz", - "integrity": "sha512-Y6RMvXsHKiBgQhm/q5MgRieXc4Tzh5p/JuDyqreI48lmy+AQfO+g9Xhz0tuGBaN1FtsrLT7mD+lbFONPo5vdwA==" + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" }, "discord-backup": { "version": "3.2.1", @@ -5863,9 +5968,9 @@ } }, "discord.js": { - "version": "13.8.0", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.0.tgz", - "integrity": "sha512-EPAA/2VLycYN5wSzavqa4iJ6qj3UtQFtHw5TH/60Fj29ymfEsCQVn//o1mTpwDxzwb+rPIrWhkxKIGGnjfv0Iw==", + "version": "13.8.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", + "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", "requires": { "@discordjs/builders": "^0.14.0", "@discordjs/collection": "^0.7.0", @@ -5876,6 +5981,26 @@ "form-data": "^4.0.0", "node-fetch": "^2.6.1", "ws": "^8.7.0" + }, + "dependencies": { + "@discordjs/builders": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", + "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "requires": { + "@sapphire/shapeshift": "^3.1.0", + "@sindresorhus/is": "^4.6.0", + "discord-api-types": "^0.33.3", + "fast-deep-equal": "^3.1.3", + "ts-mixer": "^6.0.1", + "tslib": "^2.4.0" + } + }, + "discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + } } }, "distube": { @@ -5960,6 +6085,8 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "optional": true, + "peer": true, "requires": { "iconv-lite": "^0.6.2" }, @@ -5968,6 +6095,8 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "peer": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } @@ -6327,6 +6456,16 @@ "flat-cache": "^3.0.4" } }, + "file-type": { + "version": "17.1.3", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.3.tgz", + "integrity": "sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==", + "requires": { + "readable-web-to-node-stream": "^3.0.2", + "strtok3": "^7.0.0-alpha.7", + "token-types": "^5.0.0-alpha.2" + } + }, "filelist": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.2.tgz", @@ -6660,100 +6799,11 @@ "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" - }, "himalaya": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" }, - "html-to-text": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-5.1.1.tgz", - "integrity": "sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==", - "requires": { - "he": "^1.2.0", - "htmlparser2": "^3.10.1", - "lodash": "^4.17.11", - "minimist": "^1.2.0" - }, - "dependencies": { - "dom-serializer": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", - "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", - "requires": { - "domelementtype": "^2.0.1", - "entities": "^2.0.0" - }, - "dependencies": { - "domelementtype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", - "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - } - } - }, - "domelementtype": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", - "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" - }, - "domhandler": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", - "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", - "requires": { - "domelementtype": "1" - } - }, - "domutils": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", - "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", - "requires": { - "dom-serializer": "0", - "domelementtype": "1" - } - }, - "entities": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", - "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==" - }, - "htmlparser2": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", - "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", - "requires": { - "domelementtype": "^1.3.1", - "domhandler": "^2.3.0", - "domutils": "^1.5.1", - "entities": "^1.1.1", - "inherits": "^2.0.1", - "readable-stream": "^3.1.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -6856,6 +6906,11 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -7100,11 +7155,6 @@ "libsodium": "^0.7.0" } }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, "lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -7121,6 +7171,11 @@ "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=", "dev": true }, + "lodash.uniqwith": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqwith/-/lodash.uniqwith-4.5.0.tgz", + "integrity": "sha512-7lYL8bLopMoy4CTICbxygAUq6CdRJ36vFc80DucPueUee+d5NBRxz3FdT9Pes/HEx5mPoT9jwnsEJWz1N7uq7Q==" + }, "long": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/long/-/long-5.2.0.tgz", @@ -7139,16 +7194,6 @@ "yallist": "^4.0.0" } }, - "lyrics-finder": { - "version": "21.7.0", - "resolved": "https://registry.npmjs.org/lyrics-finder/-/lyrics-finder-21.7.0.tgz", - "integrity": "sha512-AMaJ+MdbdemYOWM1Kxd/vzn23OD66/fdemaJWN9dU0qsxK6d09rODSphygAvaGka6mgfHaFlHN+ETHv/d60ftw==", - "requires": { - "encoding": "^0.1.13", - "html-to-text": "^5.1.1", - "node-fetch": "^2.6.0" - } - }, "m3u8stream": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/m3u8stream/-/m3u8stream-0.8.6.tgz", @@ -7618,6 +7663,11 @@ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" }, + "peek-readable": { + "version": "5.0.0-alpha.5", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-5.0.0-alpha.5.tgz", + "integrity": "sha512-pJohF/tDwV3ntnT5+EkUo4E700q/j/OCDuPxtM+5/kFGjyOai/sK4/We4Cy1MB2OiTQliWU5DxPvYIKQAdPqAA==" + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7723,6 +7773,26 @@ } } }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -8077,6 +8147,15 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strtok3": { + "version": "7.0.0-alpha.8", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.8.tgz", + "integrity": "sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^5.0.0-alpha.5" + } + }, "superagent": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", @@ -8197,6 +8276,15 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, + "token-types": { + "version": "5.0.0-alpha.2", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-5.0.0-alpha.2.tgz", + "integrity": "sha512-EsG9UxAW4M6VATrEEjhPFTKEUi1OiJqTUMIZOGBN49fGxYjZB36k0p7to3HZSmWRoHm1QfZgrg3e02fpqAt5fQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", diff --git a/package.json b/package.json index ecb951d4..f7a0a038 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jaba", - "version": "4.0", + "version": "TEST", "description": "A very complete Discord bot (more than 100 commands) that uses the Discord.js", "main": "index.js", "private": true, @@ -12,7 +12,9 @@ "author": "Jonny_Bro", "license": "ISC", "dependencies": { + "@discordjs/builders": "^1.0.0", "@discordjs/opus": "^0.7.0", + "@discordjs/rest": "^1.0.0", "@discordjs/voice": "^0.10.0", "@distube/soundcloud": "^1.2.1", "@distube/spotify": "^1.3.2", @@ -28,11 +30,12 @@ "colors-generator": "^0.3.4", "cron": "^1.7.2", "dblapi.js": "^2.3.0", + "discord-api-types": "^0.36.3", "discord-backup": "^3.2.1", "discord-giveaways": "github:Androz2091/discord-giveaways#develop", "discord-paginationembed": "github:gazmull/discord-paginationembed#v3", "discord-together": "^1.3.3", - "discord.js": "^13.8.0", + "discord.js": "^13.8.1", "distube": "^3.3.4", "ejs": "^3.1.3", "express": "^4.17.1", @@ -44,7 +47,6 @@ "i18next-node-fs-backend": "^2.1.3", "js-string-cleaner": "^1.0.3", "libsodium-wrappers": "^0.7.9", - "lyrics-finder": "^21.7.0", "markdown-table": "2.0.0", "mathjs": "^9.0.0", "md5": "^2.2.1", From b812a4401e112f72ce37b091e0f2271263aabce2 Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Mon, 25 Jul 2022 22:09:02 +0500 Subject: [PATCH 03/16] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=20=D0=B4=D1=80?= =?UTF-8?q?=D0=B5=D0=B2=D0=BD=D0=B5=D0=B9=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA?= =?UTF-8?q?=D0=B8=20=D1=81=20translate,=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20ownerOnly,=20=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BE=D1=82=D0=B2=D0=B5?= =?UTF-8?q?=D1=82=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/BaseCommand.js | 9 +- base/JaBa.js | 141 +++++++----------- commands/{Mention.js => Examples/mention.js} | 2 +- commands/{Ping.js => Examples/ping.js} | 0 commands/{Repeat.js => Examples/repeat.js} | 3 +- commands/Owner/eval.js | 61 ++++++++ events/CommandHandler.js | 4 +- .../en-US/administration/addcommand.json | 6 +- languages/en-US/administration/addemoji.json | 4 +- languages/en-US/administration/automod.json | 6 +- languages/en-US/administration/autorole.json | 8 +- languages/en-US/administration/backup.json | 4 +- .../en-US/administration/configuration.json | 4 +- .../en-US/administration/delcommand.json | 4 +- languages/en-US/administration/deletemod.json | 4 +- languages/en-US/administration/goodbye.json | 8 +- languages/en-US/administration/ignore.json | 4 +- languages/en-US/administration/set.json | 4 +- .../en-US/administration/setbirthdays.json | 4 +- languages/en-US/administration/setlang.json | 4 +- .../en-US/administration/setmodlogs.json | 4 +- languages/en-US/administration/setprefix.json | 6 +- .../en-US/administration/setreports.json | 4 +- .../en-US/administration/setsuggests.json | 4 +- .../en-US/administration/stealemoji.json | 4 +- languages/en-US/administration/welcome.json | 8 +- languages/en-US/economy/achievements.json | 4 +- languages/en-US/economy/birthdate.json | 4 +- languages/en-US/economy/deposit.json | 4 +- languages/en-US/economy/divorce.json | 4 +- languages/en-US/economy/leaderboard.json | 4 +- languages/en-US/economy/marry.json | 6 +- languages/en-US/economy/money.json | 4 +- languages/en-US/economy/pay.json | 4 +- languages/en-US/economy/profile.json | 6 +- languages/en-US/economy/rep.json | 4 +- languages/en-US/economy/rob.json | 4 +- languages/en-US/economy/setbio.json | 4 +- languages/en-US/economy/slots.json | 4 +- languages/en-US/economy/withdraw.json | 4 +- languages/en-US/economy/work.json | 4 +- languages/en-US/fun/8ball.json | 4 +- languages/en-US/fun/ascii.json | 4 +- languages/en-US/fun/choice.json | 4 +- languages/en-US/fun/findwords.json | 4 +- languages/en-US/fun/flip.json | 4 +- languages/en-US/fun/fml.json | 4 +- languages/en-US/fun/joke.json | 4 +- languages/en-US/fun/lmg.json | 4 +- languages/en-US/fun/lovecalc.json | 4 +- languages/en-US/fun/number.json | 4 +- languages/en-US/general/activity.json | 4 +- languages/en-US/general/calc.json | 4 +- languages/en-US/general/github.json | 4 +- languages/en-US/general/hastebin.json | 4 +- languages/en-US/general/help.json | 8 +- languages/en-US/general/invitations.json | 4 +- languages/en-US/general/invite.json | 6 +- languages/en-US/general/minecraft.json | 4 +- languages/en-US/general/permissions.json | 4 +- languages/en-US/general/ping.json | 4 +- languages/en-US/general/quote.json | 4 +- languages/en-US/general/remindme.json | 4 +- languages/en-US/general/report.json | 4 +- languages/en-US/general/serverinfo.json | 4 +- languages/en-US/general/setafk.json | 4 +- languages/en-US/general/shorturl.json | 4 +- languages/en-US/general/someone.json | 4 +- languages/en-US/general/staff.json | 4 +- languages/en-US/general/stats.json | 4 +- languages/en-US/general/suggest.json | 4 +- languages/en-US/general/translate.json | 8 +- languages/en-US/general/userinfo.json | 4 +- languages/en-US/images/approved.json | 4 +- languages/en-US/images/avatar.json | 4 +- languages/en-US/images/batslap.json | 4 +- languages/en-US/images/beautiful.json | 4 +- languages/en-US/images/bed.json | 4 +- languages/en-US/images/brazzers.json | 4 +- languages/en-US/images/burn.json | 4 +- languages/en-US/images/captcha.json | 4 +- languages/en-US/images/challenger.json | 4 +- languages/en-US/images/clyde.json | 4 +- languages/en-US/images/dictator.json | 4 +- languages/en-US/images/facepalm.json | 4 +- languages/en-US/images/fire.json | 4 +- languages/en-US/images/jail.json | 4 +- languages/en-US/images/love.json | 4 +- languages/en-US/images/mission.json | 4 +- languages/en-US/images/phcomment.json | 4 +- languages/en-US/images/qrcode.json | 4 +- languages/en-US/images/rip.json | 4 +- languages/en-US/images/scary.json | 4 +- languages/en-US/images/tobecontinued.json | 4 +- languages/en-US/images/trash.json | 4 +- languages/en-US/images/triggered.json | 4 +- languages/en-US/images/tweet.json | 4 +- languages/en-US/images/wanted.json | 4 +- languages/en-US/images/wasted.json | 4 +- languages/en-US/images/youtube-comment.json | 4 +- languages/en-US/misc.json | 2 +- languages/en-US/moderation/announcement.json | 4 +- languages/en-US/moderation/ban.json | 4 +- languages/en-US/moderation/checkinvites.json | 4 +- languages/en-US/moderation/clear.json | 4 +- languages/en-US/moderation/clearwarns.json | 4 +- languages/en-US/moderation/giveaway.json | 6 +- languages/en-US/moderation/kick.json | 4 +- languages/en-US/moderation/mute.json | 4 +- languages/en-US/moderation/poll.json | 4 +- languages/en-US/moderation/setwarns.json | 12 +- languages/en-US/moderation/unban.json | 4 +- languages/en-US/moderation/unmute.json | 4 +- languages/en-US/moderation/warn.json | 4 +- languages/en-US/moderation/warns.json | 4 +- languages/en-US/music/autoplay.json | 4 +- languages/en-US/music/back.json | 4 +- languages/en-US/music/clip.json | 4 +- languages/en-US/music/clips.json | 4 +- languages/en-US/music/filter.json | 8 +- languages/en-US/music/filters.json | 6 +- languages/en-US/music/jump.json | 6 +- languages/en-US/music/loop.json | 4 +- languages/en-US/music/lyrics.json | 4 +- languages/en-US/music/np.json | 4 +- languages/en-US/music/pause.json | 4 +- languages/en-US/music/play.json | 4 +- languages/en-US/music/queue.json | 4 +- languages/en-US/music/resume.json | 4 +- languages/en-US/music/seek.json | 4 +- languages/en-US/music/skip.json | 4 +- languages/en-US/music/stop.json | 4 +- languages/en-US/nsfw/hentai.json | 6 +- languages/en-US/owner/debug.json | 4 +- languages/en-US/owner/eval.json | 4 +- languages/en-US/owner/reload.json | 4 +- languages/en-US/owner/say.json | 4 +- languages/en-US/owner/servers-list.json | 4 +- .../ru-RU/administration/addcommand.json | 4 +- languages/ru-RU/administration/addemoji.json | 4 +- languages/ru-RU/administration/automod.json | 6 +- languages/ru-RU/administration/autorole.json | 8 +- languages/ru-RU/administration/backup.json | 4 +- .../ru-RU/administration/configuration.json | 4 +- .../ru-RU/administration/delcommand.json | 4 +- languages/ru-RU/administration/deletemod.json | 4 +- languages/ru-RU/administration/goodbye.json | 8 +- languages/ru-RU/administration/ignore.json | 4 +- languages/ru-RU/administration/set.json | 4 +- .../ru-RU/administration/setbirthdays.json | 4 +- languages/ru-RU/administration/setlang.json | 4 +- .../ru-RU/administration/setmodlogs.json | 4 +- languages/ru-RU/administration/setprefix.json | 6 +- .../ru-RU/administration/setreports.json | 4 +- .../ru-RU/administration/setsuggests.json | 4 +- .../ru-RU/administration/stealemoji.json | 4 +- languages/ru-RU/administration/welcome.json | 8 +- languages/ru-RU/economy/achievements.json | 4 +- languages/ru-RU/economy/birthdate.json | 4 +- languages/ru-RU/economy/deposit.json | 4 +- languages/ru-RU/economy/divorce.json | 4 +- languages/ru-RU/economy/findwords.json | 4 +- languages/ru-RU/economy/horserace.json | 4 +- languages/ru-RU/economy/leaderboard.json | 4 +- languages/ru-RU/economy/marry.json | 6 +- languages/ru-RU/economy/money.json | 4 +- languages/ru-RU/economy/number.json | 4 +- languages/ru-RU/economy/pay.json | 4 +- languages/ru-RU/economy/profile.json | 6 +- languages/ru-RU/economy/rep.json | 4 +- languages/ru-RU/economy/rob.json | 4 +- languages/ru-RU/economy/setbio.json | 4 +- languages/ru-RU/economy/slots.json | 4 +- languages/ru-RU/economy/tictactoe.json | 4 +- languages/ru-RU/economy/transactions.json | 4 +- languages/ru-RU/economy/withdraw.json | 4 +- languages/ru-RU/economy/work.json | 4 +- languages/ru-RU/fun/8ball.json | 4 +- languages/ru-RU/fun/ascii.json | 4 +- languages/ru-RU/fun/choice.json | 4 +- languages/ru-RU/fun/flip.json | 4 +- languages/ru-RU/fun/lmg.json | 4 +- languages/ru-RU/fun/lovecalc.json | 4 +- languages/ru-RU/fun/memes.json | 4 +- languages/ru-RU/general/activity.json | 4 +- languages/ru-RU/general/emoji.json | 4 +- languages/ru-RU/general/help.json | 6 +- languages/ru-RU/general/invite.json | 6 +- languages/ru-RU/general/invites.json | 4 +- languages/ru-RU/general/minecraft.json | 4 +- languages/ru-RU/general/permissions.json | 4 +- languages/ru-RU/general/ping.json | 4 +- languages/ru-RU/general/quote.json | 4 +- languages/ru-RU/general/remindme.json | 4 +- languages/ru-RU/general/report.json | 4 +- languages/ru-RU/general/serverinfo.json | 4 +- languages/ru-RU/general/setafk.json | 6 +- languages/ru-RU/general/shorturl.json | 4 +- languages/ru-RU/general/staff.json | 4 +- languages/ru-RU/general/stats.json | 4 +- languages/ru-RU/general/suggest.json | 4 +- languages/ru-RU/general/translate.json | 8 +- languages/ru-RU/general/userinfo.json | 4 +- languages/ru-RU/general/whois.json | 4 +- languages/ru-RU/images/approved.json | 4 +- languages/ru-RU/images/avatar.json | 4 +- languages/ru-RU/images/batslap.json | 4 +- languages/ru-RU/images/beautiful.json | 4 +- languages/ru-RU/images/bed.json | 4 +- languages/ru-RU/images/brazzers.json | 4 +- languages/ru-RU/images/burn.json | 4 +- languages/ru-RU/images/captcha.json | 4 +- languages/ru-RU/images/challenger.json | 4 +- languages/ru-RU/images/clyde.json | 4 +- languages/ru-RU/images/crush.json | 4 +- languages/ru-RU/images/dictator.json | 4 +- languages/ru-RU/images/facepalm.json | 4 +- languages/ru-RU/images/fire.json | 4 +- languages/ru-RU/images/jail.json | 4 +- languages/ru-RU/images/love.json | 4 +- languages/ru-RU/images/magik.json | 4 +- languages/ru-RU/images/mission.json | 4 +- languages/ru-RU/images/phcomment.json | 4 +- languages/ru-RU/images/ps4.json | 4 +- languages/ru-RU/images/qrcode.json | 4 +- languages/ru-RU/images/rip.json | 4 +- languages/ru-RU/images/scary.json | 4 +- languages/ru-RU/images/steamcard.json | 4 +- languages/ru-RU/images/tobecontinued.json | 4 +- languages/ru-RU/images/trash.json | 4 +- languages/ru-RU/images/triggered.json | 4 +- languages/ru-RU/images/wanted.json | 4 +- languages/ru-RU/images/wasted.json | 4 +- languages/ru-RU/images/youtube-comment.json | 4 +- languages/ru-RU/moderation/announcement.json | 4 +- languages/ru-RU/moderation/ban.json | 4 +- languages/ru-RU/moderation/clear.json | 4 +- languages/ru-RU/moderation/clearwarns.json | 4 +- languages/ru-RU/moderation/giveaway.json | 4 +- languages/ru-RU/moderation/kick.json | 4 +- languages/ru-RU/moderation/mute.json | 4 +- languages/ru-RU/moderation/poll.json | 4 +- languages/ru-RU/moderation/setwarns.json | 12 +- languages/ru-RU/moderation/unban.json | 4 +- languages/ru-RU/moderation/unmute.json | 4 +- languages/ru-RU/moderation/warn.json | 4 +- languages/ru-RU/moderation/warns.json | 4 +- languages/ru-RU/music/autoplay.json | 4 +- languages/ru-RU/music/back.json | 4 +- languages/ru-RU/music/clip.json | 4 +- languages/ru-RU/music/clips.json | 4 +- languages/ru-RU/music/filter.json | 8 +- languages/ru-RU/music/filters.json | 6 +- languages/ru-RU/music/jump.json | 6 +- languages/ru-RU/music/loop.json | 4 +- languages/ru-RU/music/lyrics.json | 4 +- languages/ru-RU/music/np.json | 4 +- languages/ru-RU/music/pause.json | 4 +- languages/ru-RU/music/play.json | 4 +- languages/ru-RU/music/queue.json | 4 +- languages/ru-RU/music/resume.json | 4 +- languages/ru-RU/music/seek.json | 4 +- languages/ru-RU/music/skip.json | 4 +- languages/ru-RU/music/stop.json | 4 +- languages/ru-RU/nsfw/nsfw.json | 4 +- languages/ru-RU/owner/debug.json | 4 +- languages/ru-RU/owner/eval.json | 4 +- languages/ru-RU/owner/reload.json | 4 +- languages/ru-RU/owner/say.json | 4 +- languages/ru-RU/owner/servers-list.json | 4 +- .../uk-UA/administration/addcommand.json | 6 +- languages/uk-UA/administration/addemoji.json | 4 +- languages/uk-UA/administration/automod.json | 6 +- languages/uk-UA/administration/autorole.json | 8 +- languages/uk-UA/administration/backup.json | 4 +- .../uk-UA/administration/configuration.json | 4 +- .../uk-UA/administration/delcommand.json | 4 +- languages/uk-UA/administration/deletemod.json | 4 +- languages/uk-UA/administration/goodbye.json | 8 +- languages/uk-UA/administration/ignore.json | 4 +- languages/uk-UA/administration/set.json | 4 +- .../uk-UA/administration/setbirthdays.json | 4 +- languages/uk-UA/administration/setlang.json | 4 +- .../uk-UA/administration/setmodlogs.json | 4 +- languages/uk-UA/administration/setprefix.json | 6 +- .../uk-UA/administration/setreports.json | 4 +- .../uk-UA/administration/setsuggests.json | 4 +- .../uk-UA/administration/stealemoji.json | 4 +- languages/uk-UA/administration/welcome.json | 8 +- languages/uk-UA/economy/achievements.json | 4 +- languages/uk-UA/economy/birthdate.json | 4 +- languages/uk-UA/economy/deposit.json | 4 +- languages/uk-UA/economy/divorce.json | 4 +- languages/uk-UA/economy/findwords.json | 4 +- languages/uk-UA/economy/horserace.json | 4 +- languages/uk-UA/economy/leaderboard.json | 4 +- languages/uk-UA/economy/marry.json | 6 +- languages/uk-UA/economy/money.json | 4 +- languages/uk-UA/economy/number.json | 4 +- languages/uk-UA/economy/pay.json | 4 +- languages/uk-UA/economy/profile.json | 6 +- languages/uk-UA/economy/rep.json | 4 +- languages/uk-UA/economy/rob.json | 4 +- languages/uk-UA/economy/setbio.json | 4 +- languages/uk-UA/economy/slots.json | 4 +- languages/uk-UA/economy/tictactoe.json | 4 +- languages/uk-UA/economy/transactions.json | 4 +- languages/uk-UA/economy/withdraw.json | 4 +- languages/uk-UA/economy/work.json | 4 +- languages/uk-UA/fun/8ball.json | 4 +- languages/uk-UA/fun/ascii.json | 4 +- languages/uk-UA/fun/choice.json | 4 +- languages/uk-UA/fun/flip.json | 4 +- languages/uk-UA/fun/lmg.json | 4 +- languages/uk-UA/fun/lovecalc.json | 4 +- languages/uk-UA/fun/memes.json | 4 +- languages/uk-UA/general/activity.json | 4 +- languages/uk-UA/general/emoji.json | 4 +- languages/uk-UA/general/help.json | 6 +- languages/uk-UA/general/invite.json | 6 +- languages/uk-UA/general/invites.json | 4 +- languages/uk-UA/general/minecraft.json | 4 +- languages/uk-UA/general/permissions.json | 4 +- languages/uk-UA/general/ping.json | 4 +- languages/uk-UA/general/quote.json | 4 +- languages/uk-UA/general/remindme.json | 4 +- languages/uk-UA/general/report.json | 4 +- languages/uk-UA/general/serverinfo.json | 4 +- languages/uk-UA/general/setafk.json | 6 +- languages/uk-UA/general/shorturl.json | 4 +- languages/uk-UA/general/staff.json | 4 +- languages/uk-UA/general/stats.json | 4 +- languages/uk-UA/general/suggest.json | 4 +- languages/uk-UA/general/translate.json | 8 +- languages/uk-UA/general/userinfo.json | 4 +- languages/uk-UA/general/whois.json | 4 +- languages/uk-UA/images/approved.json | 4 +- languages/uk-UA/images/avatar.json | 4 +- languages/uk-UA/images/batslap.json | 4 +- languages/uk-UA/images/beautiful.json | 4 +- languages/uk-UA/images/bed.json | 4 +- languages/uk-UA/images/brazzers.json | 4 +- languages/uk-UA/images/burn.json | 4 +- languages/uk-UA/images/captcha.json | 4 +- languages/uk-UA/images/challenger.json | 4 +- languages/uk-UA/images/clyde.json | 4 +- languages/uk-UA/images/crush.json | 4 +- languages/uk-UA/images/dictator.json | 4 +- languages/uk-UA/images/facepalm.json | 4 +- languages/uk-UA/images/fire.json | 4 +- languages/uk-UA/images/jail.json | 4 +- languages/uk-UA/images/love.json | 4 +- languages/uk-UA/images/magik.json | 4 +- languages/uk-UA/images/mission.json | 4 +- languages/uk-UA/images/phcomment.json | 4 +- languages/uk-UA/images/ps4.json | 4 +- languages/uk-UA/images/qrcode.json | 4 +- languages/uk-UA/images/rip.json | 4 +- languages/uk-UA/images/scary.json | 4 +- languages/uk-UA/images/steamcard.json | 4 +- languages/uk-UA/images/tobecontinued.json | 4 +- languages/uk-UA/images/trash.json | 4 +- languages/uk-UA/images/triggered.json | 4 +- languages/uk-UA/images/wanted.json | 4 +- languages/uk-UA/images/wasted.json | 4 +- languages/uk-UA/images/youtube-comment.json | 4 +- languages/uk-UA/misc.json | 2 +- languages/uk-UA/moderation/announcement.json | 4 +- languages/uk-UA/moderation/ban.json | 4 +- languages/uk-UA/moderation/clear.json | 4 +- languages/uk-UA/moderation/clearwarns.json | 4 +- languages/uk-UA/moderation/giveaway.json | 4 +- languages/uk-UA/moderation/kick.json | 4 +- languages/uk-UA/moderation/mute.json | 4 +- languages/uk-UA/moderation/poll.json | 4 +- languages/uk-UA/moderation/setwarns.json | 12 +- languages/uk-UA/moderation/unban.json | 4 +- languages/uk-UA/moderation/unmute.json | 4 +- languages/uk-UA/moderation/warn.json | 4 +- languages/uk-UA/moderation/warns.json | 4 +- languages/uk-UA/music/autoplay.json | 4 +- languages/uk-UA/music/back.json | 4 +- languages/uk-UA/music/clip.json | 4 +- languages/uk-UA/music/clips.json | 4 +- languages/uk-UA/music/filter.json | 8 +- languages/uk-UA/music/filters.json | 6 +- languages/uk-UA/music/jump.json | 6 +- languages/uk-UA/music/loop.json | 4 +- languages/uk-UA/music/lyrics.json | 4 +- languages/uk-UA/music/np.json | 4 +- languages/uk-UA/music/pause.json | 4 +- languages/uk-UA/music/play.json | 4 +- languages/uk-UA/music/queue.json | 4 +- languages/uk-UA/music/resume.json | 4 +- languages/uk-UA/music/seek.json | 4 +- languages/uk-UA/music/skip.json | 4 +- languages/uk-UA/music/stop.json | 4 +- languages/uk-UA/nsfw/nsfw.json | 4 +- languages/uk-UA/owner/debug.json | 4 +- languages/uk-UA/owner/eval.json | 4 +- languages/uk-UA/owner/reload.json | 4 +- languages/uk-UA/owner/say.json | 4 +- languages/uk-UA/owner/servers-list.json | 4 +- 403 files changed, 993 insertions(+), 953 deletions(-) rename commands/{Mention.js => Examples/mention.js} (95%) rename commands/{Ping.js => Examples/ping.js} (100%) rename commands/{Repeat.js => Examples/repeat.js} (91%) create mode 100644 commands/Owner/eval.js diff --git a/base/BaseCommand.js b/base/BaseCommand.js index 45de8430..90b2b560 100644 --- a/base/BaseCommand.js +++ b/base/BaseCommand.js @@ -1,5 +1,6 @@ +/* eslint-disable no-unused-vars */ class BaseCommand { - constructor(options) { + constructor(options, client) { /** * @type {import("@discordjs/builders").SlashCommandBuilder | import("discord.js").ApplicationCommandData} */ @@ -7,11 +8,15 @@ class BaseCommand { /** * @type {Array} */ - this.aliases = options.aliases; + this.aliases = options.aliases || []; /** * @type {Boolean} */ this.guildOnly = options.guildOnly || true; + /** + * @type {Boolean} + */ + this.ownerOnly = options.ownerOnly || false; } } diff --git a/base/JaBa.js b/base/JaBa.js index 1b4b349e..3782a482 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -117,55 +117,15 @@ class JaBa extends Client { }); } - get defaultLanguage() { - return this.languages.find(language => language.default).name; - } - - translate(key, args, locale) { - if (!locale) locale = this.defaultLanguage; - const language = this.translations.get(locale); - if (!language) throw "Invalid language set in data."; - - return language(key, args); - } - - printDate(date, format, locale) { - if (!locale) locale = this.defaultLanguage; - const languageData = this.languages.find((language) => language.name === locale || language.aliases.includes(locale)); - if (!format) format = languageData.defaultMomentFormat; - - return moment(new Date(date)) - .locale(languageData.moment) - .format(format); - } - - convertTime(time, type, noPrefix, locale) { - if (!type) time = "to"; - if (!locale) locale = this.defaultLanguage; - const languageData = this.languages.find((language) => language.name === locale || language.aliases.includes(locale)); - const m = moment(time).locale(languageData.moment); - - return (type === "to" ? m.toNow(noPrefix) : m.fromNow(noPrefix)); - } - - getNoun(number, one, two, five) { - let n = Math.abs(number); - n %= 100; - if (n >= 5 && n <= 20) return five; - n %= 10; - if (n === 1) return one; - if (n >= 2 && n <= 4) return two; - - return five; - } - /** - * - * @param {String} dir - * @param {String} guild_id - * @returns - */ + * + * @param {String} dir + * @param {String} guild_id + * @returns + */ async loadCommands(dir, guild_id) { + if (!this.translations) this.translations = await require("../helpers/languages")(); + const filePath = path.join(__dirname, dir); const files = await fs.readdir(filePath); const rest = new REST({ version: "9" }).setToken(this.config.token); @@ -174,11 +134,11 @@ class JaBa extends Client { for (let index = 0; index < files.length; index++) { const file = files[index]; const stat = await fs.lstat(path.join(filePath, file)); - if (stat.isDirectory()) this.loadCommands(this, path.join(dir, file)); + if (stat.isDirectory()) this.loadCommands(path.join(dir, file), guild_id); if (file.endsWith(".js")) { const Command = require(path.join(filePath, file)); if (Command.prototype instanceof BaseCommand) { - const command = new Command(); + const command = new Command(this); this.commands.set(command.command.name, command); const aliases = []; if (command.aliases && Array.isArray(command.aliases) && command.aliases.length > 0) { @@ -219,17 +179,17 @@ class JaBa extends Client { } /** - * - * @param {String} dir - * @returns - */ + * + * @param {String} dir + * @returns + */ async loadEvents(dir) { const filePath = path.join(__dirname, dir); const files = await fs.readdir(filePath); for (let index = 0; index < files.length; index++) { const file = files[index]; const stat = await fs.lstat(path.join(filePath, file)); - if (stat.isDirectory()) this.loadEvents(this, path.join(dir, file)); + if (stat.isDirectory()) this.loadEvents(path.join(dir, file)); if (file.endsWith(".js")) { const Event = require(path.join(filePath, file)); if (Event.prototype instanceof BaseEvent) { @@ -255,45 +215,61 @@ class JaBa extends Client { this.logger.log(`Unable to connect to the Mongodb database. Error: ${err}`, "error"); }); - const languages = require("../helpers/languages"); - this.translations = await languages(); + // const languages = require("../helpers/languages"); + // this.translations = await languages(); // const autoUpdateDocs = require("../helpers/autoUpdateDocs"); // autoUpdateDocs.update(this); } - // loadCommand(commandPath, commandName) { - // try { - // const props = new(require(`.${commandPath}${path.sep}${commandName}`))(this); - // this.logger.log(`Loading Command: ${props.help.name}. 👌`, "log"); - // props.conf.location = commandPath; - // if (props.init) props.init(this); + get defaultLanguage() { + return this.languages.find(language => language.default).name; + } - // this.commands.set(props.help.name, props); - // props.help.aliases.forEach((alias) => { - // this.aliases.set(alias, props.help.name); - // }); + /** + * + * @param {String} key + * @param {Array} args + * @param {String} locale + */ + translate(key, args, locale) { + if (!locale) locale = this.defaultLanguage; + const language = this.translations.get(locale); + if (!language) throw "Invalid language set in data."; - // return false; - // } catch (e) { - // return `Unable to load command ${commandName}: ${e}`; - // } - // } + return language(key, args); + } - // async unloadCommand(commandPath, commandName) { - // let command; - // if (this.commands.has(commandName)) command = this.commands.get(commandName); - // else if (this.aliases.has(commandName)) command = this.commands.get(this.aliases.get(commandName)); + printDate(date, format, locale) { + if (!locale) locale = this.defaultLanguage; + const languageData = this.languages.find((language) => language.name === locale || language.aliases.includes(locale)); + if (!format) format = languageData.defaultMomentFormat; - // if (!command) return `The command \`${commandName}\` doesn't seem to exist, nor is it an alias. Try again!`; - // if (command.shutdown) await command.shutdown(this); + return moment(new Date(date)) + .locale(languageData.moment) + .format(format); + } - // delete require.cache[require.resolve(`.${commandPath}${path.sep}${commandName}.js`)]; + convertTime(time, type, noPrefix, locale) { + if (!type) time = "to"; + if (!locale) locale = this.defaultLanguage; + const languageData = this.languages.find((language) => language.name === locale || language.aliases.includes(locale)); + const m = moment(time).locale(languageData.moment); - // return false; - // } + return (type === "to" ? m.toNow(noPrefix) : m.fromNow(noPrefix)); + } + + getNoun(number, one, two, five) { + let n = Math.abs(number); + n %= 100; + if (n >= 5 && n <= 20) return five; + n %= 10; + if (n === 1) return one; + if (n >= 2 && n <= 4) return two; + + return five; + } - // This function is used to find a user data or create it async findOrCreateUser({ id: userID }, isLean) { if (this.databaseCache.users.get(userID)) return isLean ? this.databaseCache.users.get(userID).toJSON() : this.databaseCache.users.get(userID); else { @@ -318,7 +294,6 @@ class JaBa extends Client { } } - // This function is used to find a member data or create it async findOrCreateMember({ id: memberID, guildID }, isLean) { if (this.databaseCache.members.get(`${memberID}${guildID}`)) return isLean ? this.databaseCache.members.get(`${memberID}${guildID}`).toJSON() : this.databaseCache.members.get(`${memberID}${guildID}`); else { @@ -353,7 +328,6 @@ class JaBa extends Client { } } - // This function is used to find a guild data or create it async findOrCreateGuild({ id: guildID }, isLean) { if (this.databaseCache.guilds.get(guildID)) return isLean ? this.databaseCache.guilds.get(guildID).toJSON() : this.databaseCache.guilds.get(guildID); else { @@ -378,7 +352,6 @@ class JaBa extends Client { } } - // This function is used to resolve a user from a string async resolveUser(search) { let user = null; if (!search || typeof search !== "string") return; diff --git a/commands/Mention.js b/commands/Examples/mention.js similarity index 95% rename from commands/Mention.js rename to commands/Examples/mention.js index 4ea58a6e..0c1923b4 100644 --- a/commands/Mention.js +++ b/commands/Examples/mention.js @@ -9,7 +9,7 @@ class Mention extends BaseCommand { super({ command: { name: "mention", - type: 2 // Type 2 is MESSAGE COMMAND. + type: 2 // Type 2 is USER COMMAND. }, aliases: ["m"], // Application command aliases. guildOnly: true // Determines whether your command is only guild. diff --git a/commands/Ping.js b/commands/Examples/ping.js similarity index 100% rename from commands/Ping.js rename to commands/Examples/ping.js diff --git a/commands/Repeat.js b/commands/Examples/repeat.js similarity index 91% rename from commands/Repeat.js rename to commands/Examples/repeat.js index f34472b0..4b593b32 100644 --- a/commands/Repeat.js +++ b/commands/Examples/repeat.js @@ -1,4 +1,3 @@ -const { TextChannel } = require("discord.js"); const BaseCommand = require("../base/BaseCommand"); class Repeat extends BaseCommand { @@ -10,7 +9,7 @@ class Repeat extends BaseCommand { super({ command: { name: "repeat", // Application command name. - type: 3 // Type 3 is USER COMMAND. + type: 3 // Type 3 is MESSAGE COMMAND. }, aliases: ["r"], // Application command aliases. guildOnly: true // Determines whether your command is only guild. diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js new file mode 100644 index 00000000..1c25fd0a --- /dev/null +++ b/commands/Owner/eval.js @@ -0,0 +1,61 @@ +/* eslint-disable no-unused-vars */ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const BaseCommand = require("../../base/BaseCommand"); + +class Eval extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("eval") + .setDescription(client.translate("owner/eval:DESCRIPTION")) + .addStringOption(option => + option.setName("code") + .setDescription(client.translate("owner/eval:USAGE")) + .setRequired(true)), + aliases: ["e"], + guildOnly: true, + ownerOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad(client) { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction, data) { + const code = interaction.options.getString("code"); + const result = new Promise((resolve) => resolve(eval(code))); + + return result.then((output) => { + if (typeof output != "string") output = require("util").inspect(output, { depth: 0 }); + + if (output.includes(client.token)) output = output.replace(client.token, "T0K3N"); + interaction.reply({ + content: "```js\n" + output + "```", + ephemeral: true + }); + }).catch((err) => { + console.error(err); + err = err.toString(); + + if (err.includes(client.token)) err = err.replace(client.token, "T0K3N"); + interaction.reply({ + content: "```js\n" + err + "```", + ephemeral: true + }); + }); + } +} +module.exports = Eval; \ No newline at end of file diff --git a/events/CommandHandler.js b/events/CommandHandler.js index ab43668d..bcc84875 100644 --- a/events/CommandHandler.js +++ b/events/CommandHandler.js @@ -15,6 +15,7 @@ class CommandHandler extends BaseEvent { */ async execute(client, interaction) { if (interaction.type !== "APPLICATION_COMMAND" && !interaction.isCommand()) return; + const command = client.commands.get(interaction.commandName); const data = []; @@ -23,7 +24,8 @@ class CommandHandler extends BaseEvent { }); data.userData = userData; - if (command.guildOnly && !interaction.inGuild()) return; + if (command.guildOnly && !interaction.inGuild()) return interaction.reply({ content: client.translate("misc:GUILD_ONLY"), ephemeral: true}); + if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.reply({ content: client.translate("misc:OWNER_ONLY"), ephemeral: true }); if (interaction.inGuild()) { const guildData = await client.findOrCreateGuild({ diff --git a/languages/en-US/administration/addcommand.json b/languages/en-US/administration/addcommand.json index ed74a241..5c9f22df 100644 --- a/languages/en-US/administration/addcommand.json +++ b/languages/en-US/administration/addcommand.json @@ -1,8 +1,8 @@ { "DESCRIPTION": "Add a custom command!", - "USAGE": "{{prefix}}addcommand [name] [answer]", - "EXAMPLES": "{{prefix}}addcommand hello Hello {user}! How are you?", + "USAGE": "addcommand [name] [answer]", + "EXAMPLES": "addcommand hello Hello {user}! How are you?", "MISSING_NAME": "Please provide a command name!", "MISSING_ANSWER": "Please provide a command answer!", - "SUCCESS": "Command **{{prefix}}{{commandName}}** added!" + "SUCCESS": "Command **{{commandName}}** added!" } \ No newline at end of file diff --git a/languages/en-US/administration/addemoji.json b/languages/en-US/administration/addemoji.json index a66d70b7..b7f0b81b 100644 --- a/languages/en-US/administration/addemoji.json +++ b/languages/en-US/administration/addemoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Add an emoji to the server!", - "USAGE": "{{prefix}}addemoji [image-url] [name]", - "EXAMPLES": "{{prefix}}addemoji https://via.placeholder.com/150 test-emoji", + "USAGE": "addemoji [image-url] [name]", + "EXAMPLES": "addemoji https://via.placeholder.com/150 test-emoji", "MISSING_URL": "Please provide an image URL!", "MISSING_NAME": "Please provide an emoji name!", "INVALID_NAME": "The length of the emoji name must be between 2 and 32!", diff --git a/languages/en-US/administration/automod.json b/languages/en-US/administration/automod.json index e2803ae0..939e7846 100644 --- a/languages/en-US/administration/automod.json +++ b/languages/en-US/administration/automod.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Toggle Discord invites automatic deletion", - "USAGE": "{{prefix}}automod [on/off] (#channel)", - "EXAMPLES": "{{prefix}}automod on\n{{prefix}}automod off #general\n{{prefix}}automod off", + "USAGE": "automod [on/off] (#channel)", + "EXAMPLES": "automod on\nautomod off #general\nautomod off", "MISSING_STATUS": "Please enter a valid value between `on` and `off`", - "ENABLED": "**Discord invites will be automatically deleted!**\n\n:arrow_right_hook: *Send `{{prefix}}automod off #channel` to ignore a channel!*", + "ENABLED": "**Discord invites will be automatically deleted!**\n\n:arrow_right_hook: *Send `automod off #channel` to ignore a channel!*", "DISABLED_CHANNEL": "Auto-moderation will no longer be performed in {{channel}}!", "DISABLED": "All right! Auto moderation is no longer effective on this server!", "DELETED": "Your message was deleted because Discord invitations are not allowed on this server!" diff --git a/languages/en-US/administration/autorole.json b/languages/en-US/administration/autorole.json index 6c6a3099..40eec238 100644 --- a/languages/en-US/administration/autorole.json +++ b/languages/en-US/administration/autorole.json @@ -1,10 +1,10 @@ { "DESCRIPTION": "Toggle autorole on the server!", - "USAGE": "{{prefix}}autorole [on/off] (role)", - "EXAMPLES": "{{prefix}}autorole on @Members\n{{prefix}}autorole off", + "USAGE": "autorole [on/off] (role)", + "EXAMPLES": "autorole on @Members\nautorole off", "MISSING_STATUS": "Please specify a valid value between `on` and `off`", "MISSING_ROLE": "Please specify a valid role!", "SUCCESS_ENABLED": "Autorole enabled! New members will automatically receive the **{{roleName}}** role.", - "ALREADY_DISABLED": "**The autorole is already disabled.**\n\n:arrow_right_hook: *Send `{{prefix}}autorole on @YourRole` to enable it again!*", - "SUCCESS_DISABLED": "**Autorole disabled!**\n\n:arrow_right_hook: *Send `{{prefix}}configuration` to see the updated configuration!*" + "ALREADY_DISABLED": "**The autorole is already disabled.**\n\n:arrow_right_hook: *Send `autorole on @YourRole` to enable it again!*", + "SUCCESS_DISABLED": "**Autorole disabled!**\n\n:arrow_right_hook: *Send `configuration` to see the updated configuration!*" } \ No newline at end of file diff --git a/languages/en-US/administration/backup.json b/languages/en-US/administration/backup.json index d6668084..fec00f04 100644 --- a/languages/en-US/administration/backup.json +++ b/languages/en-US/administration/backup.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Manage your server backups in an efficient way!", - "USAGE": "{{prefix}}backup [create/load/infos]", - "EXAMPLES": "{{prefix}}backup create\n{{prefix}}backup load 558328638911545423\n{{prefix}}backup infos 558328638911545423", + "USAGE": "backup [create/load/infos]", + "EXAMPLES": "backup create\nbackup load 558328638911545423\nbackup infos 558328638911545423", "MISSING_STATUS": "Select an action between: `create`, `load` and `info`!", "MISSING_BACKUP_ID": "Please enter a backup ID!", "NO_BACKUP_FOUND": "No backup found for `{{backupID}}`", diff --git a/languages/en-US/administration/configuration.json b/languages/en-US/administration/configuration.json index f20b3b5d..95ebdd6c 100644 --- a/languages/en-US/administration/configuration.json +++ b/languages/en-US/administration/configuration.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows the server configuration!", - "USAGE": "{{prefix}}configuration", - "EXAMPLES": "{{prefix}}configuration", + "USAGE": "configuration", + "EXAMPLES": "configuration", "PREFIX_TITLE": "Server prefix", "IGNORED_CHANNELS_TITLE": "Ignored channel(s)", "NO_IGNORED_CHANNELS": "No ignored channels.", diff --git a/languages/en-US/administration/delcommand.json b/languages/en-US/administration/delcommand.json index 2a91ef5c..d3a93eea 100644 --- a/languages/en-US/administration/delcommand.json +++ b/languages/en-US/administration/delcommand.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Remove a custom command!", - "USAGE": "{{prefix}}delcommand [name-of-the-command]", - "EXAMPLES": "{{prefix}}delcommand hey", + "USAGE": "delcommand [name-of-the-command]", + "EXAMPLES": "delcommand hey", "MISSING_NAME": "Please enter a valid custom command name!", "UNKNOWN_COMMAND": "The command {{commandName}} doesn't exist!", "SUCCESS": "The {{commandName}} command has been removed from the server!" diff --git a/languages/en-US/administration/deletemod.json b/languages/en-US/administration/deletemod.json index 5377a3e2..62c70b6e 100644 --- a/languages/en-US/administration/deletemod.json +++ b/languages/en-US/administration/deletemod.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Toggle moderation commands auto deletion!", - "USAGE": "{{prefix}}deletemod [on/off]", - "EXAMPLES": "{{prefix}}deletemod on", + "USAGE": "deletemod [on/off]", + "EXAMPLES": "deletemod on", "MISSING_STATUS": "You must specify `on` or `off`", "ENABLED": "Automatic moderation commands deletion!", "DISABLED": "Automatic moderation commands deletion disabled!" diff --git a/languages/en-US/administration/goodbye.json b/languages/en-US/administration/goodbye.json index c756a795..82830167 100644 --- a/languages/en-US/administration/goodbye.json +++ b/languages/en-US/administration/goodbye.json @@ -1,16 +1,16 @@ { "DESCRIPTION": "Toggle goodbye messages!", - "USAGE": "{{prefix}}goodbye", - "EXAMPLES": "{{prefix}}goodbye", + "USAGE": "goodbye", + "EXAMPLES": "goodbye", "MISSING_STATUS": "You must specify an action between `edit` and `off`", "DEFAULT_MESSAGE": "Goodbye {user}! We're now {membercount} without you... :'(", "TEST_SUCCESS": "Test executed!", "FORM_1": "**In which channel will goodbye messages be sent?**\n\n:arrow_right_hook: *Answer by mentioning a channel!*", "FORM_2": "**Please enter your desired goodbye message.**\n\n**If you want to:**\n*-* __Mention the user__: {user}\n*-* __Get the member count__: {membercount}\n*-* __Get the server name__: {server}\n\n**Usage example:**\nGoodbye {user}, we will miss you! We are now {membercount}.\n:fast_forward:\nGoodbye {{author}}, we will miss you! We are now {{memberCount}}.", "FORM_3": "**Do you want a great goodbye image too?**\n\n:arrow_right_hook: *Answer by sending `yes` or `no`!*", - "FORM_SUCCESS": "**Alright, done!**\n\n:arrow_right_hook: *Answer by sending `{{prefix}}goodbye test` to preview your custom goodbye message!*", + "FORM_SUCCESS": "**Alright, done!**\n\n:arrow_right_hook: *Answer by sending `goodbye test` to preview your custom goodbye message!*", "MAX_CHARACT": "Your message must not exceed 1800 characters!", - "DISABLED": "**Goodbye messages have just been disabled!**\n\n:arrow_right_hook: *Answer by sending `{{prefix}}configuration` to see the updated server configuration!*", + "DISABLED": "**Goodbye messages have just been disabled!**\n\n:arrow_right_hook: *Answer by sending `configuration` to see the updated server configuration!*", "IMG_GOODBYE": "Leaving from {{server}}!", "IMG_NB": "- {{memberCount}}th member!", "TITLE": "GOODBYE" diff --git a/languages/en-US/administration/ignore.json b/languages/en-US/administration/ignore.json index 7efdf2eb..3b78eddc 100644 --- a/languages/en-US/administration/ignore.json +++ b/languages/en-US/administration/ignore.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Toggle commands in a channel", - "USAGE": "{{prefix}}ignore [channel]", - "EXAMPLES": "{{prefix}}ignore #channel", + "USAGE": "ignore [channel]", + "EXAMPLES": "ignore #channel", "ALLOWED": "Commands are now allowed in {{channel}}!", "IGNORED": "Commands are now forbidden in {{channel}}!" } \ No newline at end of file diff --git a/languages/en-US/administration/set.json b/languages/en-US/administration/set.json index 806c3de6..78a9e576 100644 --- a/languages/en-US/administration/set.json +++ b/languages/en-US/administration/set.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Change user's XP, level, credits or bank!", - "USAGE": "{{prefix}}set [level/xp/credits/bank] [@user] [value]", - "EXAMPLES": "{{prefix}}set level @Jonny_Bro#4226 10", + "USAGE": "set [level/xp/credits/bank] [@user] [value]", + "EXAMPLES": "set level @Jonny_Bro#4226 10", "INVALID_MEMBER": "You must mention the user!", "NO_STATUS": "Select a parameter: `level`, `xp`, `credits` or `bank`", "BOT_USER": "Bots don't have a profile!", diff --git a/languages/en-US/administration/setbirthdays.json b/languages/en-US/administration/setbirthdays.json index c90ed0ea..8459ff69 100644 --- a/languages/en-US/administration/setbirthdays.json +++ b/languages/en-US/administration/setbirthdays.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Set the birthdays announcements channel!", - "USAGE": "{{prefix}}setbirthdays (#channel)", - "EXAMPLES": "{{prefix}}setbirthdays #birthdays\n{{prefix}}setbirthdays", + "USAGE": "setbirthdays (#channel)", + "EXAMPLES": "setbirthdays #birthdays\nsetbirthdays", "SUCCESS_ENABLED": "Birthdays announcements will be sent in **{{channel}}**!", "SUCCESS_DISABLED": "Birthdays announcements disabled!" } \ No newline at end of file diff --git a/languages/en-US/administration/setlang.json b/languages/en-US/administration/setlang.json index 168dfbac..8225b208 100644 --- a/languages/en-US/administration/setlang.json +++ b/languages/en-US/administration/setlang.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Change the server language!", - "USAGE": "{{prefix}}setlang [language]", - "EXAMPLES": "{{prefix}}setlang french\n{{prefix}}setlang english", + "USAGE": "setlang [language]", + "EXAMPLES": "setlang french\nsetlang english", "MISSING_LANG": "Please enter a valid language between theses: {{list}}", "SUCCESS": ":flag_us: The language of this server is now **{{lang}}**!" } \ No newline at end of file diff --git a/languages/en-US/administration/setmodlogs.json b/languages/en-US/administration/setmodlogs.json index 28a0c682..9e94f1af 100644 --- a/languages/en-US/administration/setmodlogs.json +++ b/languages/en-US/administration/setmodlogs.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Set the moderation logs channel!", - "USAGE": "{{prefix}}setmodlogs (#channel)", - "EXAMPLES": "{{prefix}}setmodlogs #modlogs\n{{prefix}}setmodlogs", + "USAGE": "setmodlogs (#channel)", + "EXAMPLES": "setmodlogs #modlogs\nsetmodlogs", "SUCCESS_ENABLED": "Moderation logs will be sent in **{{channel}}**!", "SUCCESS_DISABLED": "Moderation logs channel deleted!" } \ No newline at end of file diff --git a/languages/en-US/administration/setprefix.json b/languages/en-US/administration/setprefix.json index 2f867970..07a9c668 100644 --- a/languages/en-US/administration/setprefix.json +++ b/languages/en-US/administration/setprefix.json @@ -1,8 +1,8 @@ { "DESCRIPTION": "Set the server prefix!", - "USAGE": "{{prefix}}setprefix [prefix]", - "EXAMPLES": "{{prefix}}setprefix +", + "USAGE": "setprefix [prefix]", + "EXAMPLES": "setprefix +", "MISSING_PREFIX": "Please enter a valid prefix!", "TOO_LONG": "The prefix shouldn't exceed 5 characters!", - "SUCCESS": "The bot prefix has been set to `{{prefix}}`!" + "SUCCESS": "The bot prefix has been set to ``!" } \ No newline at end of file diff --git a/languages/en-US/administration/setreports.json b/languages/en-US/administration/setreports.json index a0efb7ac..2ebce3f2 100644 --- a/languages/en-US/administration/setreports.json +++ b/languages/en-US/administration/setreports.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Set the reports channel!", - "USAGE": "{{prefix}}setreports (#channel)", - "EXAMPLES": "{{prefix}}setreports #reports\n{{prefix}}setreports", + "USAGE": "setreports (#channel)", + "EXAMPLES": "setreports #reports\nsetreports", "SUCCESS_ENABLED": "Reports will be sent in **{{channel}}**!", "SUCCESS_DISABLED": "Reports channel deleted!" } \ No newline at end of file diff --git a/languages/en-US/administration/setsuggests.json b/languages/en-US/administration/setsuggests.json index 52037260..bf584af4 100644 --- a/languages/en-US/administration/setsuggests.json +++ b/languages/en-US/administration/setsuggests.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Set the suggestions channel!", - "USAGE": "{{prefix}}setsuggests (#channel)", - "EXAMPLES": "{{prefix}}setsuggests #suggestions\n{{prefix}}setsuggests", + "USAGE": "setsuggests (#channel)", + "EXAMPLES": "setsuggests #suggestions\nsetsuggests", "SUCCESS_ENABLED": "Suggestions will be sent in **{{channel}}**!", "SUCCESS_DISABLED": "Suggestions channel deleted!" } \ No newline at end of file diff --git a/languages/en-US/administration/stealemoji.json b/languages/en-US/administration/stealemoji.json index f5b39ee0..b062b03b 100644 --- a/languages/en-US/administration/stealemoji.json +++ b/languages/en-US/administration/stealemoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Steal emoji!", - "USAGE": "{{prefix}}stealemoji [emoji]", - "EXAMPLES": "{{prefix}}stealemoji :coolstorybob:", + "USAGE": "stealemoji [emoji]", + "EXAMPLES": "stealemoji :coolstorybob:", "MISSING_EMOJI": "Please provide an emoji!", "SUCCESS": "{{emoji}} added!", "ERROR": "{{emoji}} couldn't be added. Check if your server still has space for new emojis!" diff --git a/languages/en-US/administration/welcome.json b/languages/en-US/administration/welcome.json index d4337349..6d597e50 100644 --- a/languages/en-US/administration/welcome.json +++ b/languages/en-US/administration/welcome.json @@ -1,16 +1,16 @@ { "DESCRIPTION": "Toggle welcome messages!", - "USAGE": "{{prefix}}welcome", - "EXAMPLES": "{{prefix}}welcome", + "USAGE": "welcome", + "EXAMPLES": "welcome", "MISSING_STATUS": "You must specify an action between `edit` and `off`", "DEFAULT_MESSAGE": "Welcome {user} in {server}, we're now {membercount}! Your account was created {createdat}.", "TEST_SUCCESS": "Test executed!", "FORM_1": "**In which channel will welcome messages be sent?**\n\n:arrow_right_hook: *Answer by mentioning a channel!*", "FORM_2": "**Please enter your desired welcome message.**\n\n**If you want to:**\n*-* __Mention the user__: {user}\n*-* __Get the member count__: {membercount}\n*-* __Get the server name__: {server}\n\n**Usage example:**\nWelcome to {server}, {user}! We are now {membercount}!\n:fast_forward:\nWelcome to {{guildName}}, {{author}}! We are now {{memberCount}}!", "FORM_3": "**Do you want a great welcome image too?**\n\n:arrow_right_hook: *Answer by sending `yes` or `no`!*", - "FORM_SUCCESS": "**Alright, done!**\n\n:arrow_right_hook: *Answer by sending `{{prefix}}welcome test` to preview your custom welcome message!*", + "FORM_SUCCESS": "**Alright, done!**\n\n:arrow_right_hook: *Answer by sending `welcome test` to preview your custom welcome message!*", "MAX_CHARACT": "Your message must be under 1800 symbols!", - "DISABLED": "**Goodbye messages have just been disabled!**\n\n:arrow_right_hook: *Answer by sending `{{prefix}}configuration` to see the updated server configuration!*", + "DISABLED": "**Goodbye messages have just been disabled!**\n\n:arrow_right_hook: *Answer by sending `configuration` to see the updated server configuration!*", "IMG_WELCOME": "Welcome in {{server}}!", "IMG_NB": "- {{memberCount}}th member!", "TITLE": "WELCOME" diff --git a/languages/en-US/economy/achievements.json b/languages/en-US/economy/achievements.json index d01406c3..ebfa4755 100644 --- a/languages/en-US/economy/achievements.json +++ b/languages/en-US/economy/achievements.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows your achievements list!", - "USAGE": "{{prefix}}achievements", - "EXAMPLES": "{{prefix}}achievements", + "USAGE": "achievements", + "EXAMPLES": "achievements", "SEND_CMD": "Send your first command!", "CLAIM_SALARY": "Claim your salary 10 times!", "MARRY": "Find your half and marry!", diff --git a/languages/en-US/economy/birthdate.json b/languages/en-US/economy/birthdate.json index ee7cfdca..d0b030c7 100644 --- a/languages/en-US/economy/birthdate.json +++ b/languages/en-US/economy/birthdate.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Set the birthday date that appear on your profile", - "USAGE": "{{prefix}}birthdate (date)", - "EXAMPLES": "{{prefix}}birthdate 01/12/2000", + "USAGE": "birthdate (date)", + "EXAMPLES": "birthdate 01/12/2000", "MISSING_DATE": "Please enter a valid date! For example, 01/12/2000", "INVALID_DATE": "You must use the following date format: DD/MM/YYYY. For example, `December 1, 2000` will be `01/12/2000`.", "DATE_TOO_HIGH": "More than 80 years old? :eyes:", diff --git a/languages/en-US/economy/deposit.json b/languages/en-US/economy/deposit.json index fd4d5d34..755fbc8a 100644 --- a/languages/en-US/economy/deposit.json +++ b/languages/en-US/economy/deposit.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Deposit your money in the bank", - "USAGE": "{{prefix}}deposit [amount]", - "EXAMPLES": "{{prefix}}deposit 400", + "USAGE": "deposit [amount]", + "EXAMPLES": "deposit 400", "MISSING_AMOUNT": "Please specify an amount!", "NO_CREDIT": "You have no credit to deposit in the bank!", "NO_ENOUGH_CREDIT": "You don't have `{{money}}` credits!", diff --git a/languages/en-US/economy/divorce.json b/languages/en-US/economy/divorce.json index babe2942..e56a9ec4 100644 --- a/languages/en-US/economy/divorce.json +++ b/languages/en-US/economy/divorce.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Divorce the person you are currently married to!", - "USAGE": "{{prefix}}divorce", - "EXAMPLES": "{{prefix}}divorce", + "USAGE": "divorce", + "EXAMPLES": "divorce", "NOT_MARRIED": "You are not currently married!", "DIVORCED": "You just divorced with **{{username}}**!" } \ No newline at end of file diff --git a/languages/en-US/economy/leaderboard.json b/languages/en-US/economy/leaderboard.json index 681b9555..39eeb9d3 100644 --- a/languages/en-US/economy/leaderboard.json +++ b/languages/en-US/economy/leaderboard.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows users who have the most credits, levels or reputation points!", - "USAGE": "{{prefix}}leaderboard [rep/level/credits]", - "EXAMPLES": "{{prefix}}leaderboard credits\n{{prefix}}leaderboard level", + "USAGE": "leaderboard [rep/level/credits]", + "EXAMPLES": "leaderboard credits\nleaderboard level", "MISSING_TYPE": "Please specify the leaderboard type between `credits`, `level` and `rep`", "MOBILE": ":confused: We've detected that you are using a phone.... The leaderboard may not display well on small screens. Try to switch to landscape or go on the dashboard!" } \ No newline at end of file diff --git a/languages/en-US/economy/marry.json b/languages/en-US/economy/marry.json index 32c81d1a..d28e0ad5 100644 --- a/languages/en-US/economy/marry.json +++ b/languages/en-US/economy/marry.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Marry someone you love!", - "USAGE": "{{prefix}}marry [@member]", - "EXAMPLES": "{{prefix}}marry @Jonny_Bro#4226", + "USAGE": "marry [@member]", + "EXAMPLES": "marry @Jonny_Bro#4226", "INVALID_MEMBER": "You must mention a valid member!", - "ALREADY_MARRIED": "You are already married! First use `{{prefix}}divorce` to divorce.", + "ALREADY_MARRIED": "You are already married! First use `divorce` to divorce.", "ALREADY_MARRIED_USER": "The place is taken, companion! **{{username}}** is already married!", "YOURSELF": "You can't marry yourself!", "REQUEST_AUTHOR_TO_AMEMBER": "You already have a pending request to **{{username}}**!", diff --git a/languages/en-US/economy/money.json b/languages/en-US/economy/money.json index dc699b8a..f420a54c 100644 --- a/languages/en-US/economy/money.json +++ b/languages/en-US/economy/money.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Shows your credits", - "USAGE": "{{prefix}}money (@member)", - "EXAMPLES": "{{prefix}}money\n{{prefix}}money @user#0000", + "USAGE": "money (@member)", + "EXAMPLES": "money\nmoney @user#0000", "TITLE": "{{username}}'s money" } \ No newline at end of file diff --git a/languages/en-US/economy/pay.json b/languages/en-US/economy/pay.json index 4f9d8e54..19dfeac5 100644 --- a/languages/en-US/economy/pay.json +++ b/languages/en-US/economy/pay.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Send money to someone!", - "USAGE": "{{prefix}}pay [@member] [amount]", - "EXAMPLES": "{{prefix}}pay @Jonny_Bro#4226 100", + "USAGE": "pay [@member] [amount]", + "EXAMPLES": "pay @Jonny_Bro#4226 100", "INVALID_MEMBER": "You must mention a valid member!", "BOT_USER": "Bots are already rich 💰!", "YOURSELF": "You can't pay yourself!", diff --git a/languages/en-US/economy/profile.json b/languages/en-US/economy/profile.json index 20f9f02c..3b0be50f 100644 --- a/languages/en-US/economy/profile.json +++ b/languages/en-US/economy/profile.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows the mentioned user or author profile", - "USAGE": "{{prefix}}profile [user]", - "EXAMPLES": "{{prefix}}profile @Jonny_Bro#4226", + "USAGE": "profile [user]", + "EXAMPLES": "profile @Jonny_Bro#4226", "TITLE": "{{username}}'s profile", "NO_BIO": "No biography", "BOT_USER": "Bots don't have profile page!", @@ -19,7 +19,7 @@ "REGISTERED": "📅 Registered", "NO_LOVER": "Single", "ACHIEVEMENTS": "🔥 Achievements", - "ACHIEVEMENTS_CONTENT": "Get more information with `{{prefix}}achievements`!", + "ACHIEVEMENTS_CONTENT": "Get more information with `achievements`!", "BIO": "🔖 Biography", "YOUR_PROFILE": "Your profile" } \ No newline at end of file diff --git a/languages/en-US/economy/rep.json b/languages/en-US/economy/rep.json index 0d8ea386..70001362 100644 --- a/languages/en-US/economy/rep.json +++ b/languages/en-US/economy/rep.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Give a reputation point to someone!", - "USAGE": "{{prefix}}rep [user]", - "EXAMPLES": "{{prefix}}rep @Jonny_Bro#4226", + "USAGE": "rep [user]", + "EXAMPLES": "rep @Jonny_Bro#4226", "COOLDOWN": "You have to wait {{time}} before being able to `rep` someone!", "INVALID_USER": "You must mention a valid user!", "BOT_USER": "Bots don't accept reputation points!", diff --git a/languages/en-US/economy/rob.json b/languages/en-US/economy/rob.json index 4ebbc63d..977fc9f9 100644 --- a/languages/en-US/economy/rob.json +++ b/languages/en-US/economy/rob.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Try to rob a member!", - "USAGE": "{{prefix}}rob [@member] [amount]", - "EXAMPLES": "{{prefix}}rob @Jonny_Bro#4226 100", + "USAGE": "rob [@member] [amount]", + "EXAMPLES": "rob @Jonny_Bro#4226 100", "YOURSELF": "You can't rob yourself!", "MISSING_MEMBER": "You must specify a valid member to rob!", "MISSING_AMOUNT": "Please enter a valid amount!", diff --git a/languages/en-US/economy/setbio.json b/languages/en-US/economy/setbio.json index b2258622..542001ea 100644 --- a/languages/en-US/economy/setbio.json +++ b/languages/en-US/economy/setbio.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Change your biography!", - "USAGE": "{{prefix}}setbio [biography]", - "EXAMPLES": "{{prefix}}setbio My name is Jake, I'm 19 and I love programming!", + "USAGE": "setbio [biography]", + "EXAMPLES": "setbio My name is Jake, I'm 19 and I love programming!", "MISSING": "You must specify a biography!", "MAX_CHARACT": "Your biography must not exceed 500 characters!", "SUCCESS": "Your biography has been modified!" diff --git a/languages/en-US/economy/slots.json b/languages/en-US/economy/slots.json index a0f9cf13..18faa59e 100644 --- a/languages/en-US/economy/slots.json +++ b/languages/en-US/economy/slots.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "The JaBa casino", - "USAGE": "{{prefix}}slots [amount]", - "EXAMPLES": "{{prefix}}slots\n{{prefix}}slots 10", + "USAGE": "slots [amount]", + "EXAMPLES": "slots\nslots 10", "DEFEAT": "**{{username}}** used {{money}} credit(s) and lost everything.", "VICTORY": "**{{username}}** used {{money}} credit(s) and won {{won}} credit(s)!", "NOT_ENOUGH": "You need at least **{{money}}** credit(s)." diff --git a/languages/en-US/economy/withdraw.json b/languages/en-US/economy/withdraw.json index bcedb652..2917d6f1 100644 --- a/languages/en-US/economy/withdraw.json +++ b/languages/en-US/economy/withdraw.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Withdraw money!", - "USAGE": "{{prefix}}withdraw [amount]", - "EXAMPLES": "{{prefix}}withdraw 400", + "USAGE": "withdraw [amount]", + "EXAMPLES": "withdraw 400", "MISSING_AMOUNT": "Please specify an amount to be withdrawn!", "NO_CREDIT": "You don't have any credit in your bank!", "NOT_ENOUGH": "You need at least `{{money}}` credit(s)!", diff --git a/languages/en-US/economy/work.json b/languages/en-US/economy/work.json index b43a51f7..786fb210 100644 --- a/languages/en-US/economy/work.json +++ b/languages/en-US/economy/work.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Claim your salary!", - "USAGE": "{{prefix}}work", - "EXAMPLES": "{{prefix}}work", + "USAGE": "work", + "EXAMPLES": "work", "COOLDOWN": "You have to wait {{time}} before working again!", "AWARD": "Complete the word AWARD to win 200 bonus credits!", "SALARY": "Salary", diff --git a/languages/en-US/fun/8ball.json b/languages/en-US/fun/8ball.json index 5ee3f6e8..ead32e4c 100644 --- a/languages/en-US/fun/8ball.json +++ b/languages/en-US/fun/8ball.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "I'm telling you the truth!", - "USAGE": "{{prefix}}8ball [question]", - "EXAMPLES": "{{prefix}}8ball Is JaBa the best Discord bot?", + "USAGE": "8ball [question]", + "EXAMPLES": "8ball Is JaBa the best Discord bot?", "ERR_QUESTION": "You must enter a question!", "RESPONSE_1": "It is certain", "RESPONSE_2": "It is decidedly so", diff --git a/languages/en-US/fun/ascii.json b/languages/en-US/fun/ascii.json index 19d0539f..6ff8f3da 100644 --- a/languages/en-US/fun/ascii.json +++ b/languages/en-US/fun/ascii.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Turn your text into ascii characters!", - "USAGE": "{{prefix}}ascii [text]", - "EXAMPLES": "{{prefix}}ascii Hello world!", + "USAGE": "ascii [text]", + "EXAMPLES": "ascii Hello world!", "TEXT_MISSING": "Please enter a valid text (less than 20 characters)!" } \ No newline at end of file diff --git a/languages/en-US/fun/choice.json b/languages/en-US/fun/choice.json index b6b17dcd..75313b1d 100644 --- a/languages/en-US/fun/choice.json +++ b/languages/en-US/fun/choice.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Helps you choose between the given choices!", - "USAGE": "{{prefix}}choice [choice1/choice2/etc...]", - "EXAMPLES": "{{prefix}}choice Fire/Wind/Water", + "USAGE": "choice [choice1/choice2/etc...]", + "EXAMPLES": "choice Fire/Wind/Water", "MISSING": "You must enter more than two choices!\n(or use the `flip` command instead)", "EMPTY": "One of your choices seems to be empty.... Please try again!", "PROGRESS": "Choice being made...", diff --git a/languages/en-US/fun/findwords.json b/languages/en-US/fun/findwords.json index 65b305f3..e4e9b7ba 100644 --- a/languages/en-US/fun/findwords.json +++ b/languages/en-US/fun/findwords.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Start a Findwords party, a game where you have to find words!", - "USAGE": "{{prefix}}findwords", - "EXAMPLES": "{{prefix}}findwords", + "USAGE": "findwords", + "EXAMPLES": "findwords", "INVALID_WORD": "{{member}} | Your word is not valid!", "GAME_STARTING": ":timer: | The game starts in 10 seconds!", "FIND_WORD": "20 seconds to find a word containing \"__**{{word}}**__\"!", diff --git a/languages/en-US/fun/flip.json b/languages/en-US/fun/flip.json index c121405c..3e1ea659 100644 --- a/languages/en-US/fun/flip.json +++ b/languages/en-US/fun/flip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "I roll the dice for you!", - "USAGE": "{{prefix}}flip", - "EXAMPLES": "{{prefix}}flip", + "USAGE": "flip", + "EXAMPLES": "flip", "HEADS": "🎲 | Heads!", "TAILS": "🎲 | Tails!" } \ No newline at end of file diff --git a/languages/en-US/fun/fml.json b/languages/en-US/fun/fml.json index 4bb18596..eeef2938 100644 --- a/languages/en-US/fun/fml.json +++ b/languages/en-US/fun/fml.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Gets a random FML", - "USAGE": "{{prefix}}fml", - "EXAMPLES": "{{prefix}}fml", + "USAGE": "fml", + "EXAMPLES": "fml", "FOOTER": "blague.xyz | By Skiz#0001" } \ No newline at end of file diff --git a/languages/en-US/fun/joke.json b/languages/en-US/fun/joke.json index e8dff737..169f0eb5 100644 --- a/languages/en-US/fun/joke.json +++ b/languages/en-US/fun/joke.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Gets a wonderful joke specially made for you!", - "USAGE": "{{prefix}}joke", - "EXAMPLES": "{{prefix}}joke", + "USAGE": "joke", + "EXAMPLES": "joke", "FOOTER": "blague.xyz | By Skiz#0001" } \ No newline at end of file diff --git a/languages/en-US/fun/lmg.json b/languages/en-US/fun/lmg.json index 73f8d05b..abe376a3 100644 --- a/languages/en-US/fun/lmg.json +++ b/languages/en-US/fun/lmg.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Generate a LMGTFY link with your search", - "USAGE": "{{prefix}}lmg [search]", - "EXAMPLES": "{{prefix}}lmg How to create a Discord bot?", + "USAGE": "lmg [search]", + "EXAMPLES": "lmg How to create a Discord bot?", "MISSING": "You must specify a search!" } \ No newline at end of file diff --git a/languages/en-US/fun/lovecalc.json b/languages/en-US/fun/lovecalc.json index 4491712f..f0ae330f 100644 --- a/languages/en-US/fun/lovecalc.json +++ b/languages/en-US/fun/lovecalc.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Love calculator", - "USAGE": "{{prefix}}lovecalc [@member1] (@member2)", - "EXAMPLES": "{{prefix}}lovecalc @Jonny_Bro#4226\n{{prefix}}lovecalc @Jonny_Bro#4226 @JaBa#9042", + "USAGE": "lovecalc [@member1] (@member2)", + "EXAMPLES": "lovecalc @Jonny_Bro#4226\nlovecalc @Jonny_Bro#4226 @JaBa#9042", "MISSING": "You must mention two members!", "CONTENT": "There's **{{percent}}%** of love between **{{firstUsername}}** and **{{secondUsername}}**!\n**Congrats!**" } \ No newline at end of file diff --git a/languages/en-US/fun/number.json b/languages/en-US/fun/number.json index 93c1f957..65abd392 100644 --- a/languages/en-US/fun/number.json +++ b/languages/en-US/fun/number.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Find the right number!", - "USAGE": "{{prefix}}number", - "EXAMPLES": "{{prefix}}number", + "USAGE": "number", + "EXAMPLES": "number", "GAME_START": "Number chosen, you can start!", "BIG": "{{user}} | My number is **bigger** than `{{number}}`!", "SMALL": "{{user}} | My number is **smaller** than `{{number}}`!", diff --git a/languages/en-US/general/activity.json b/languages/en-US/general/activity.json index 6de5cb5e..e40f8bc6 100644 --- a/languages/en-US/general/activity.json +++ b/languages/en-US/general/activity.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Start activity in voice channel!", - "USAGE": "{{prefix}}activity (activity)", - "EXAMPLES": "{{prefix}}activity\n{{prefix}}activity chess", + "USAGE": "activity (activity)", + "EXAMPLES": "activity\nactivity chess", "TITLE": "All available activities", "FOOTER": "JaBa | Discord Together" } \ No newline at end of file diff --git a/languages/en-US/general/calc.json b/languages/en-US/general/calc.json index 2bcaf535..03741ba0 100644 --- a/languages/en-US/general/calc.json +++ b/languages/en-US/general/calc.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Calculator able to solve complex operations and to convert units!", - "USAGE": "{{prefix}}calc [calculation]", - "EXAMPLES": "{{prefix}}10*5+sin(3)\n{{prefix}}calc 10cm to m", + "USAGE": "calc [calculation]", + "EXAMPLES": "10*5+sin(3)\ncalc 10cm to m", "MISSING_CALC": "Please enter a calculation!", "INVALID_CALC": "Please enter a **valid** calculation!", "TITLE": "Calculator", diff --git a/languages/en-US/general/github.json b/languages/en-US/general/github.json index 5fe4edb6..ac700c1f 100644 --- a/languages/en-US/general/github.json +++ b/languages/en-US/general/github.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows JaBa's v2 Github repository information!", - "USAGE": "{{prefix}}github", - "EXAMPLES": "{{prefix}}github", + "USAGE": "github", + "EXAMPLES": "github", "CLICK_HERE": "Click here to access the github of JaBa", "LANGUAGE": "Programming language", "OWNER": "JaBa's repository owner" diff --git a/languages/en-US/general/hastebin.json b/languages/en-US/general/hastebin.json index d6f86235..ca825649 100644 --- a/languages/en-US/general/hastebin.json +++ b/languages/en-US/general/hastebin.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Upload your text on hastebin!", - "USAGE": "{{prefix}}hastebin [text]", - "EXAMPLES": "{{prefix}}hastebin Hello World!", + "USAGE": "hastebin [text]", + "EXAMPLES": "hastebin Hello World!", "MISSING_TEXT": "Please enter a valid text!", "SUCCESS": "Upload complete!" } \ No newline at end of file diff --git a/languages/en-US/general/help.json b/languages/en-US/general/help.json index 0f3e2236..20ed800e 100644 --- a/languages/en-US/general/help.json +++ b/languages/en-US/general/help.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Show commands list or specific command help.", - "USAGE": "{{prefix}}help (command)", - "EXAMPLES": "{{prefix}}help\n{{prefix}}help ping", + "USAGE": "help (command)", + "EXAMPLES": "help\nhelp ping", "CUSTOM": "A custom command doesn't have help page.", "NOT_FOUND": "`{{search}}` is not a valid command", "FIELD_USAGE": "Usage", @@ -10,8 +10,8 @@ "FIELD_EXAMPLES": "Examples", "FIELD_PERMISSIONS": "Permissions", "NO_ALIAS": "No alias", - "CMD_TITLE": "{{prefix}}{{cmd}} help", - "INFO": "● To get help on a specific command type `{{prefix}}help `!", + "CMD_TITLE": "{{cmd}} help", + "INFO": "● To get help on a specific command type `help `!", "CUSTOM_COMMANDS": "Custom commands", "TITLE": "{{name}} | Commands", "NO_REQUIRED_PERMISSION": "No specific permission is required to execute this command." diff --git a/languages/en-US/general/invitations.json b/languages/en-US/general/invitations.json index d375d06c..ee034d83 100644 --- a/languages/en-US/general/invitations.json +++ b/languages/en-US/general/invitations.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows the number of people you have invited to the server!", - "USAGE": "{{prefix}}invitations (@member)", - "EXAMPLES": "{{prefix}}invitations\n{{prefix}}invitations @Jonny_Bro#4226", + "USAGE": "invitations (@member)", + "EXAMPLES": "invitations\ninvitations @Jonny_Bro#4226", "NOBODY_AUTHOR": "You didn't invite anyone to the server!", "NOBODY_MEMBER": "{{member}} didn't invite anyone to the server!", "CODE": "**{{code}}** ({{uses}} uses) | {{channel}}", diff --git a/languages/en-US/general/invite.json b/languages/en-US/general/invite.json index 1e58f9aa..1573418a 100644 --- a/languages/en-US/general/invite.json +++ b/languages/en-US/general/invite.json @@ -1,10 +1,10 @@ { "DESCRIPTION": "Shows JaBa links!", - "USAGE": "{{prefix}}invite (copy)", - "EXAMPLES": "{{prefix}}invite\n{{prefix}}invite copy", + "USAGE": "invite (copy)", + "EXAMPLES": "invite\ninvite copy", "LINKS": "JaBa links", "CLICK": "[**Click**]({{link}})", - "TIP": "Send `{{prefix}}invite copy` to be able to copy the invite link!", + "TIP": "Send `invite copy` to be able to copy the invite link!", "ADD": "Invite JaBa", "VOTE": "Vote for JaBa", "SUPPORT": "Support developer" diff --git a/languages/en-US/general/minecraft.json b/languages/en-US/general/minecraft.json index 658f2662..dd98d7d7 100644 --- a/languages/en-US/general/minecraft.json +++ b/languages/en-US/general/minecraft.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows information about a Minecraft server!", - "USAGE": "{{prefix}}minecraft [ip]", - "EXAMPLES": "{{prefix}}minecraft mc.hypixel.net", + "USAGE": "minecraft [ip]", + "EXAMPLES": "minecraft mc.hypixel.net", "MISSING_IP": "Please enter a valid IP address!", "FAILED": "This server is offline or blocking access!", "ONLINE": "Online", diff --git a/languages/en-US/general/permissions.json b/languages/en-US/general/permissions.json index 41b264cc..8bf38e65 100644 --- a/languages/en-US/general/permissions.json +++ b/languages/en-US/general/permissions.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Displays the member's permissions in the channel", - "USAGE": "{{prefix}}permissions (@member)", - "EXAMPLES": "{{prefix}}permissions\n{{prefix}}permissions @Jonny_Bro#4226", + "USAGE": "permissions (@member)", + "EXAMPLES": "permissions\npermissions @Jonny_Bro#4226", "TITLE": "{{user}}'s permissions in {{channel}}" } \ No newline at end of file diff --git a/languages/en-US/general/ping.json b/languages/en-US/general/ping.json index 23263ca6..b4a5c414 100644 --- a/languages/en-US/general/ping.json +++ b/languages/en-US/general/ping.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Show bot's ping", - "USAGE": "{{prefix}}ping", - "EXAMPLES": "{{prefix}}ping", + "USAGE": "ping", + "EXAMPLES": "ping", "CONTENT": "Pong! My ping is `{{ping}}` ms." } \ No newline at end of file diff --git a/languages/en-US/general/quote.json b/languages/en-US/general/quote.json index bfa71af3..7c029a5f 100644 --- a/languages/en-US/general/quote.json +++ b/languages/en-US/general/quote.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Quote a message in the channel!", - "USAGE": "{{prefix}}quote [messageID] [channel]", - "EXAMPLES": "{{prefix}}quote 596018101921906698\n{{prefix}}quote 596018101921906698 573508780520898581\n{{prefix}}quote 596018101921906698 #blabla", + "USAGE": "quote [messageID] [channel]", + "EXAMPLES": "quote 596018101921906698\nquote 596018101921906698 573508780520898581\nquote 596018101921906698 #blabla", "NO_MESSAGE_ID": "No message has this ID.", "NO_CHANNEL_ID": "No channel has this ID.", "MISSING_ID": "Please enter a valid message ID to quote!" diff --git a/languages/en-US/general/remindme.json b/languages/en-US/general/remindme.json index 6404efeb..35e0488c 100644 --- a/languages/en-US/general/remindme.json +++ b/languages/en-US/general/remindme.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Add a new personal reminder", - "USAGE": "{{prefix}}remindme [message]", - "EXAMPLES": "{{prefix}}remindme 24h Work command\n{{prefix}}remindme 3m Take the pasta out of the pan!", + "USAGE": "remindme [message]", + "EXAMPLES": "remindme 24h Work command\nremindme 3m Take the pasta out of the pan!", "MISSING_MESSAGE": "You must enter a message!", "SAVED": "Reminder saved, you will receive a message at the end of the time!", "TITLE": "JaBa Reminder", diff --git a/languages/en-US/general/report.json b/languages/en-US/general/report.json index 39df7ce5..af4f21e1 100644 --- a/languages/en-US/general/report.json +++ b/languages/en-US/general/report.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Send your report to the channel defined for them!", - "USAGE": "{{prefix}}report [@user] [reason]", - "EXAMPLES": "{{prefix}}report @Jonny_Bro#4226 Breaking the rules", + "USAGE": "report [@user] [reason]", + "EXAMPLES": "report @Jonny_Bro#4226 Breaking the rules", "MISSING_CHANNEL": "No report channel defined!", "MISSING_REASON": "Please enter a report reason!", "MISSING_USER": "Please mention the user you want report!", diff --git a/languages/en-US/general/serverinfo.json b/languages/en-US/general/serverinfo.json index fce6b0bf..492db045 100644 --- a/languages/en-US/general/serverinfo.json +++ b/languages/en-US/general/serverinfo.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows information about the server!", - "USAGE": "{{prefix}}serverinfo [ID/Name]", - "EXAMPLES": "{{prefix}}serverinfo JaBa\n{{prefix}}serverinfo", + "USAGE": "serverinfo [ID/Name]", + "EXAMPLES": "serverinfo JaBa\nserverinfo", "AFK_CHANNEL": "AFK channel", "NO_AFK_CHANNEL": "No AFK channel", "MEMBERS": "{{count}} members", diff --git a/languages/en-US/general/setafk.json b/languages/en-US/general/setafk.json index ebd8d120..3318064e 100644 --- a/languages/en-US/general/setafk.json +++ b/languages/en-US/general/setafk.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Become AFK (members who mention you will receive a message)", - "USAGE": "{{prefix}}setafk [reason]", - "EXAMPLES": "{{prefix}}setafk I'm eating =)", + "USAGE": "setafk [reason]", + "EXAMPLES": "setafk I'm eating =)", "MISSING_REASON": "Please specify the reason for your AFK status!", "SUCCESS": "You're now AFK (reason: {{reason}})", "DELETED": "**{{username}}**, your AFK status has just been deleted!", diff --git a/languages/en-US/general/shorturl.json b/languages/en-US/general/shorturl.json index 979eadd3..c547853b 100644 --- a/languages/en-US/general/shorturl.json +++ b/languages/en-US/general/shorturl.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Make your links shorter!", - "USAGE": "{{prefix}}shorturl [url]", - "EXAMPLES": "{{prefix}}shorturl https://google.fr", + "USAGE": "shorturl [url]", + "EXAMPLES": "shorturl https://google.fr", "MISSING_URL": "Please enter a valid URL!" } \ No newline at end of file diff --git a/languages/en-US/general/someone.json b/languages/en-US/general/someone.json index 8c145736..6c3df2a8 100644 --- a/languages/en-US/general/someone.json +++ b/languages/en-US/general/someone.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Pick a random member on the server!", - "USAGE": "{{prefix}}someone", - "EXAMPLES": "{{prefix}}someone" + "USAGE": "someone", + "EXAMPLES": "someone" } \ No newline at end of file diff --git a/languages/en-US/general/staff.json b/languages/en-US/general/staff.json index c63c450d..9cce4a29 100644 --- a/languages/en-US/general/staff.json +++ b/languages/en-US/general/staff.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows the server staff members list!", - "USAGE": "{{prefix}}staff", - "EXAMPLES": "{{prefix}}staff", + "USAGE": "staff", + "EXAMPLES": "staff", "TITLE": "{{guild}} staff", "ADMINS": "Administrators", "NO_ADMINS": "No administrators", diff --git a/languages/en-US/general/stats.json b/languages/en-US/general/stats.json index ebf047db..1c93bc12 100644 --- a/languages/en-US/general/stats.json +++ b/languages/en-US/general/stats.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows the bot stats!", - "USAGE": "{{prefix}}stats", - "EXAMPLES": "{{prefix}}stats", + "USAGE": "stats", + "EXAMPLES": "stats", "COUNTS_TITLE": "• __Statistics__", "COUNTS_CONTENT": "`Servers: {{servers}}`\n`Users: {{users}}`", "VERSIONS_TITLE": "• __Using__", diff --git a/languages/en-US/general/suggest.json b/languages/en-US/general/suggest.json index 5281890c..0742f2ab 100644 --- a/languages/en-US/general/suggest.json +++ b/languages/en-US/general/suggest.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Send your suggestion to the defined channel!", - "USAGE": "{{prefix}}suggest [message]", - "EXAMPLES": "{{prefix}}suggest New channel #offtopic please", + "USAGE": "suggest [message]", + "EXAMPLES": "suggest New channel #offtopic please", "MISSING_CHANNEL": "No suggestion channel defined!", "MISSING_CONTENT": "Please enter a suggestion!", "TITLE": "Suggestion - {{user}}", diff --git a/languages/en-US/general/translate.json b/languages/en-US/general/translate.json index 0923dd3f..1fbe559d 100644 --- a/languages/en-US/general/translate.json +++ b/languages/en-US/general/translate.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Translate your text!", - "USAGE": "{{prefix}}translate [language] [message]", - "EXAMPLES": "{{prefix}}translate russian How are you ?", + "USAGE": "translate [language] [message]", + "EXAMPLES": "translate russian How are you ?", "LIST_SENT": "The languages list has just been sent to you by private messages!", - "MISSING_LANGUAGE": "Please enter a language! To display the languages list, type `{{prefix}}translate langs-list`!", - "INVALID_LANGUAGE": "The language `{{search}}` does not exist! To display the languages list, type `{{prefix}}translate langs-list`!", + "MISSING_LANGUAGE": "Please enter a language! To display the languages list, type `translate langs-list`!", + "INVALID_LANGUAGE": "The language `{{search}}` does not exist! To display the languages list, type `translate langs-list`!", "MISSING_CONTENT": "Please enter a text to be translated!" } \ No newline at end of file diff --git a/languages/en-US/general/userinfo.json b/languages/en-US/general/userinfo.json index a82d11c3..f25efba5 100644 --- a/languages/en-US/general/userinfo.json +++ b/languages/en-US/general/userinfo.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows user information!", - "USAGE": "{{prefix}}userinfo (@user/userID)", - "EXAMPLES": "{{prefix}}userinfo\n{{prefix}}userinfo @Jonny_Bro#4226\n{{prefix}}userinfo 281361531411890186", + "USAGE": "userinfo (@user/userID)", + "EXAMPLES": "userinfo\nuserinfo @Jonny_Bro#4226\nuserinfo 281361531411890186", "INVALID_USER": "No user on Discord has the `{{search}}` ID!", "NO_GAME": "Not playing", "NO_ROLE": "No role", diff --git a/languages/en-US/images/approved.json b/languages/en-US/images/approved.json index e0a793ee..210577b1 100644 --- a/languages/en-US/images/approved.json +++ b/languages/en-US/images/approved.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"approved\" image", - "USAGE": "{{prefix}}approved (@member)", - "EXAMPLES": "{{prefix}}approved\n{{prefix}}approved @Jonny_Bro#4226" + "USAGE": "approved (@member)", + "EXAMPLES": "approved\napproved @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/avatar.json b/languages/en-US/images/avatar.json index 29679ef0..2008dda3 100644 --- a/languages/en-US/images/avatar.json +++ b/languages/en-US/images/avatar.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Shows the avatar of the mentionned member", - "USAGE": "{{prefix}}avatar (@member)", - "EXAMPLES": "{{prefix}}avatar\n{{prefix}}avatar @Jonny_Bro#4226\n{{prefix}}avatar link" + "USAGE": "avatar (@member)", + "EXAMPLES": "avatar\navatar @Jonny_Bro#4226\navatar link" } \ No newline at end of file diff --git a/languages/en-US/images/batslap.json b/languages/en-US/images/batslap.json index 833f998b..1ec72bcd 100644 --- a/languages/en-US/images/batslap.json +++ b/languages/en-US/images/batslap.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"batslap\" image", - "USAGE": "{{prefix}}batslap (@member1) (@member2)", - "EXAMPLES": "{{prefix}}batslap\n{{prefix}}batslap @Jonny_Bro#4226 @Jonny_Bro#4226" + "USAGE": "batslap (@member1) (@member2)", + "EXAMPLES": "batslap\nbatslap @Jonny_Bro#4226 @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/beautiful.json b/languages/en-US/images/beautiful.json index e1eb0720..b954777f 100644 --- a/languages/en-US/images/beautiful.json +++ b/languages/en-US/images/beautiful.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"beautiful\" image", - "USAGE": "{{prefix}}beautiful (@member)", - "EXAMPLES": "{{prefix}}beautiful\n{{prefix}}beautiful @Jonny_Bro#4226" + "USAGE": "beautiful (@member)", + "EXAMPLES": "beautiful\nbeautiful @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/bed.json b/languages/en-US/images/bed.json index c31debbb..03a304de 100644 --- a/languages/en-US/images/bed.json +++ b/languages/en-US/images/bed.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"love\" image using the Nekobot API", - "USAGE": "{{prefix}}love [@member1] (@member2)", - "EXAMPLES": "{{prefix}}love @Jonny_Bro#4226\n{{prefix}}love @Jonny_Bro#4226 @Marty#0303" + "USAGE": "love [@member1] (@member2)", + "EXAMPLES": "love @Jonny_Bro#4226\nlove @Jonny_Bro#4226 @Marty#0303" } \ No newline at end of file diff --git a/languages/en-US/images/brazzers.json b/languages/en-US/images/brazzers.json index 49cf2763..31347855 100644 --- a/languages/en-US/images/brazzers.json +++ b/languages/en-US/images/brazzers.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"dictator\" image", - "USAGE": "{{prefix}}dictator (@member)", - "EXAMPLES": "{{prefix}}dictator\n{{prefix}}dictator @Jonny_Bro#4226" + "USAGE": "dictator (@member)", + "EXAMPLES": "dictator\ndictator @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/burn.json b/languages/en-US/images/burn.json index 3867c539..7370f622 100644 --- a/languages/en-US/images/burn.json +++ b/languages/en-US/images/burn.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"brazzers\" image", - "USAGE": "{{prefix}}brazzers (@member)", - "EXAMPLES": "{{prefix}}brazzers\n{{prefix}}brazzers @Jonny_Bro#4226" + "USAGE": "brazzers (@member)", + "EXAMPLES": "brazzers\nbrazzers @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/captcha.json b/languages/en-US/images/captcha.json index 0c0d5f79..240744d9 100644 --- a/languages/en-US/images/captcha.json +++ b/languages/en-US/images/captcha.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"captcha\" image using the Nekobot API", - "USAGE": "{{prefix}}captcha (@member)", - "EXAMPLES": "{{prefix}}captcha\n{{prefix}}captcha @Jonny_Bro#4226" + "USAGE": "captcha (@member)", + "EXAMPLES": "captcha\ncaptcha @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/challenger.json b/languages/en-US/images/challenger.json index 03fcead0..5de58909 100644 --- a/languages/en-US/images/challenger.json +++ b/languages/en-US/images/challenger.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"challenger\" image", - "USAGE": "{{prefix}}challenger (@member)", - "EXAMPLES": "{{prefix}}challenger\n{{prefix}}challenger @Jonny_Bro#4226" + "USAGE": "challenger (@member)", + "EXAMPLES": "challenger\nchallenger @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/clyde.json b/languages/en-US/images/clyde.json index 933a3bfb..d1b7c53f 100644 --- a/languages/en-US/images/clyde.json +++ b/languages/en-US/images/clyde.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Generates a \"Clyde\" message image using the Nekobot API", - "USAGE": "{{prefix}}clyde [text]", - "EXAMPLES": "{{prefix}}clyde Discord will close on December 11, 2002. Goodbye.", + "USAGE": "clyde [text]", + "EXAMPLES": "clyde Discord will close on December 11, 2002. Goodbye.", "MISSING_TEXT": "Please specify the message text!" } \ No newline at end of file diff --git a/languages/en-US/images/dictator.json b/languages/en-US/images/dictator.json index 8841de34..49f248ff 100644 --- a/languages/en-US/images/dictator.json +++ b/languages/en-US/images/dictator.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"burn\" image", - "USAGE": "{{prefix}}burn (@member)", - "EXAMPLES": "{{prefix}}burn\n{{prefix}}burn @Jonny_Bro#4226" + "USAGE": "burn (@member)", + "EXAMPLES": "burn\nburn @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/facepalm.json b/languages/en-US/images/facepalm.json index 5a0231c8..e197eda6 100644 --- a/languages/en-US/images/facepalm.json +++ b/languages/en-US/images/facepalm.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"facepalm\" image using canvas", - "USAGE": "{{prefix}}facepalm (@member)", - "EXAMPLES": "{{prefix}}facepalm\n{{prefix}}facepalm @Jonny_Bro#4226" + "USAGE": "facepalm (@member)", + "EXAMPLES": "facepalm\nfacepalm @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/fire.json b/languages/en-US/images/fire.json index 590fade0..f02a4c37 100644 --- a/languages/en-US/images/fire.json +++ b/languages/en-US/images/fire.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"fire\" image using Amethyste API", - "USAGE": "{{prefix}}fire (@member)", - "EXAMPLES": "{{prefix}}fire\n{{prefix}}fire @Jonny_Bro#4226" + "USAGE": "fire (@member)", + "EXAMPLES": "fire\nfire @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/jail.json b/languages/en-US/images/jail.json index fdfe3235..0fed529c 100644 --- a/languages/en-US/images/jail.json +++ b/languages/en-US/images/jail.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"jail\" image using Amethyste API", - "USAGE": "{{prefix}}jail (@member)", - "EXAMPLES": "{{prefix}}jail\n{{prefix}}jail @Jonny_Bro#4226" + "USAGE": "jail (@member)", + "EXAMPLES": "jail\njail @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/love.json b/languages/en-US/images/love.json index 5103f36f..ab23454e 100644 --- a/languages/en-US/images/love.json +++ b/languages/en-US/images/love.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"bed\" image", - "USAGE": "{{prefix}}bed [@member1] (@member2)", - "EXAMPLES": "{{prefix}}bed @Jonny_Bro#4226\n{{prefix}}bed @Jonny_Bro#4226 @Marty#0303" + "USAGE": "bed [@member1] (@member2)", + "EXAMPLES": "bed @Jonny_Bro#4226\nbed @Jonny_Bro#4226 @Marty#0303" } \ No newline at end of file diff --git a/languages/en-US/images/mission.json b/languages/en-US/images/mission.json index 19d96270..c094737f 100644 --- a/languages/en-US/images/mission.json +++ b/languages/en-US/images/mission.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"mission\" image using Amethyste API", - "USAGE": "{{prefix}}mission (@member)", - "EXAMPLES": "{{prefix}}mission\n{{prefix}}mission @Jonny_Bro#4226" + "USAGE": "mission (@member)", + "EXAMPLES": "mission\nmission @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/phcomment.json b/languages/en-US/images/phcomment.json index 73368d74..2ee8070f 100644 --- a/languages/en-US/images/phcomment.json +++ b/languages/en-US/images/phcomment.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Generates a \"phcomment\" image", - "USAGE": "{{prefix}}phcomment (@member) [text]", - "EXAMPLES": "{{prefix}}phcomment Hi!\n{{prefix}}phcomment @Jonny_Bro#4226 Hi!", + "USAGE": "phcomment (@member) [text]", + "EXAMPLES": "phcomment Hi!\nphcomment @Jonny_Bro#4226 Hi!", "MISSING_TEXT": "Please specify the comment text!" } \ No newline at end of file diff --git a/languages/en-US/images/qrcode.json b/languages/en-US/images/qrcode.json index c98ae782..1e3cbdc9 100644 --- a/languages/en-US/images/qrcode.json +++ b/languages/en-US/images/qrcode.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Generates a QR code image from a given text", - "USAGE": "{{prefix}}qrcode [text]", - "EXAMPLES": "{{prefix}}qrcode Hello", + "USAGE": "qrcode [text]", + "EXAMPLES": "qrcode Hello", "MISSING_TEXT": "Please specify the QR code source text!", "SUCCESS": "Here's your QRCode!" } \ No newline at end of file diff --git a/languages/en-US/images/rip.json b/languages/en-US/images/rip.json index 4fa1c99f..d619a023 100644 --- a/languages/en-US/images/rip.json +++ b/languages/en-US/images/rip.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"rip\" image using Nekobot API", - "USAGE": "{{prefix}}rip (@member)", - "EXAMPLES": "{{prefix}}rip\n{{prefix}}rip @Jonny_Bro#4226" + "USAGE": "rip (@member)", + "EXAMPLES": "rip\nrip @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/scary.json b/languages/en-US/images/scary.json index 7a70559f..8d98729d 100644 --- a/languages/en-US/images/scary.json +++ b/languages/en-US/images/scary.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"scary\" image using Nekobot API", - "USAGE": "{{prefix}}scary (@member)", - "EXAMPLES": "{{prefix}}scary\n{{prefix}}scary @Jonny_Bro#4226" + "USAGE": "scary (@member)", + "EXAMPLES": "scary\nscary @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/tobecontinued.json b/languages/en-US/images/tobecontinued.json index b61ab27b..20fb548a 100644 --- a/languages/en-US/images/tobecontinued.json +++ b/languages/en-US/images/tobecontinued.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"tobecontinued\" image using Nekobot API", - "USAGE": "{{prefix}}tobecontinued (@member)", - "EXAMPLES": "{{prefix}}tobecontinued\n{{prefix}}tobecontinued @Jonny_Bro#4226" + "USAGE": "tobecontinued (@member)", + "EXAMPLES": "tobecontinued\ntobecontinued @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/trash.json b/languages/en-US/images/trash.json index f1dc0098..a116b288 100644 --- a/languages/en-US/images/trash.json +++ b/languages/en-US/images/trash.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"trash\" image", - "USAGE": "{{prefix}}trash (@member)", - "EXAMPLES": "{{prefix}}trash\n{{prefix}}trash @Jonny_Bro#4226" + "USAGE": "trash (@member)", + "EXAMPLES": "trash\ntrash @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/triggered.json b/languages/en-US/images/triggered.json index b0ffdc88..575682d3 100644 --- a/languages/en-US/images/triggered.json +++ b/languages/en-US/images/triggered.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"triggered\" image using Nekobot API", - "USAGE": "{{prefix}}triggered (@member)", - "EXAMPLES": "{{prefix}}triggered\n{{prefix}}triggered @Jonny_Bro#4226" + "USAGE": "triggered (@member)", + "EXAMPLES": "triggered\ntriggered @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/tweet.json b/languages/en-US/images/tweet.json index 751a38ce..6dcd45f8 100644 --- a/languages/en-US/images/tweet.json +++ b/languages/en-US/images/tweet.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Generates a \"tweet\" image using Nekobot API", - "USAGE": "{{prefix}}tweet [@twitter_username] [content]", - "EXAMPLES": "{{prefix}}tweet @ElonMusk Hello", + "USAGE": "tweet [@twitter_username] [content]", + "EXAMPLES": "tweet @ElonMusk Hello", "MISSING_USERNAME": "You have to enter someone's twitter nickname!", "MISSING_TEXT": "You have to specify the tweet content!", "SUCCESS": "New tweet by {{user}}:" diff --git a/languages/en-US/images/wanted.json b/languages/en-US/images/wanted.json index 2d3f8c93..bd9a9e3e 100644 --- a/languages/en-US/images/wanted.json +++ b/languages/en-US/images/wanted.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"wanted\" image using Nekobot API", - "USAGE": "{{prefix}}wanted (@member)", - "EXAMPLES": "{{prefix}}wanted\n{{prefix}}wanted @Jonny_Bro#4226" + "USAGE": "wanted (@member)", + "EXAMPLES": "wanted\nwanted @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/wasted.json b/languages/en-US/images/wasted.json index 1ca6f19f..119c9e3d 100644 --- a/languages/en-US/images/wasted.json +++ b/languages/en-US/images/wasted.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"wasted\" image using Nekobot API", - "USAGE": "{{prefix}}wasted (@member)", - "EXAMPLES": "{{prefix}}wasted\n{{prefix}}wasted @Jonny_Bro#4226" + "USAGE": "wasted (@member)", + "EXAMPLES": "wasted\nwasted @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/en-US/images/youtube-comment.json b/languages/en-US/images/youtube-comment.json index 33a4c1d4..17bd8c95 100644 --- a/languages/en-US/images/youtube-comment.json +++ b/languages/en-US/images/youtube-comment.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Generates a \"ytcomment\" image", - "USAGE": "{{prefix}}ytcomment (@member) [text]", - "EXAMPLES": "{{prefix}}ytcomment Hi!\n{{prefix}}ytcomment @Jonny_Bro#4226 Hi!" + "USAGE": "ytcomment (@member) [text]", + "EXAMPLES": "ytcomment Hi!\nytcomment @Jonny_Bro#4226 Hi!" } \ No newline at end of file diff --git a/languages/en-US/misc.json b/languages/en-US/misc.json index 8da7f8c1..77be4bc5 100644 --- a/languages/en-US/misc.json +++ b/languages/en-US/misc.json @@ -16,7 +16,7 @@ "NO_USER_FOUND_ID": "No user on Discord has the ID `{{id}}`!", "VOTE_DM": "⬆️ Hello {{user}}, thanks for voting!\nHere's your reward: 40 credits (on the support server)!", "VOTE_LOGS": "⬆️ **{{usertag}}** (`{{userid}}`) voted for **JaBa** and won **40** credits, thank you!\n", - "HELLO_SERVER": "Hello **{{username}}**, my prefix on this server is `{{prefix}}`. Use `{{prefix}}help` to get the list of the commands!", + "HELLO_SERVER": "Hello **{{username}}**, my prefix on this server is ``. Use `help` to get the list of the commands!", "HELLO_DM": "Hello, as you are currently in direct message you don't need to add a prefix before command name.", "GUILD_ONLY": "This command is only available on a server!", "MISSING_BOT_PERMS": "I need the following permissions to execute this command: {{list}}", diff --git a/languages/en-US/moderation/announcement.json b/languages/en-US/moderation/announcement.json index dd3ad383..be59a179 100644 --- a/languages/en-US/moderation/announcement.json +++ b/languages/en-US/moderation/announcement.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Send an announcement in the current channel!", - "USAGE": "{{prefix}}announcement [text]", - "EXAMPLES": "{{prefix}}announcement New staff member!", + "USAGE": "announcement [text]", + "EXAMPLES": "announcement New staff member!", "MISSING_TEXT": "You must enter the announcement text!", "TOO_LONG": "Your text should be shorter than 1030 characters!", "MENTION_PROMPT": "Would you like to add a mention to your message?\nAnswer by sending `yes` or `no`!", diff --git a/languages/en-US/moderation/ban.json b/languages/en-US/moderation/ban.json index 972f9d4f..fe82230d 100644 --- a/languages/en-US/moderation/ban.json +++ b/languages/en-US/moderation/ban.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Ban the mentioned member!", - "USAGE": "{{prefix}}ban [@user] (reason)", - "EXAMPLES": "{{prefix}}ban @Jonny_Bro#4226 Spam", + "USAGE": "ban [@user] (reason)", + "EXAMPLES": "ban @Jonny_Bro#4226 Spam", "MISSING_MEMBER": "Please specify a valid member to ban!", "YOURSELF": "You can't ban yourself!", "SUPERIOR": "You can't sanction or update a sanction for a member who has an higher or equal role hierarchy to yours!", diff --git a/languages/en-US/moderation/checkinvites.json b/languages/en-US/moderation/checkinvites.json index a05db124..889bdfdf 100644 --- a/languages/en-US/moderation/checkinvites.json +++ b/languages/en-US/moderation/checkinvites.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Check if members have a Discord server link in their status!", - "USAGE": "{{prefix}}checkinvites", - "EXAMPLES": "{{prefix}}checkinvites", + "USAGE": "checkinvites", + "EXAMPLES": "checkinvites", "NOBODY": "No member advertises in their status!" } diff --git a/languages/en-US/moderation/clear.json b/languages/en-US/moderation/clear.json index 5e314339..3f585c45 100644 --- a/languages/en-US/moderation/clear.json +++ b/languages/en-US/moderation/clear.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Quickly delete multiple messages!", - "USAGE": "{{prefix}}clear [number-of-messages] (@member)", - "EXAMPLES": "{{prefix}}clear 10\n{{prefix}}clear 10 @Jonny_Bro#4226", + "USAGE": "clear [number-of-messages] (@member)", + "EXAMPLES": "clear 10\nclear 10 @Jonny_Bro#4226", "MISSING_AMOUNT": "You must specify a number of messages to delete!", "ALL_CONFIRM": "All the channel messages will be deleted! To confirm type `-confirm`", "CHANNEL_CLEARED": "Channel cleared!", diff --git a/languages/en-US/moderation/clearwarns.json b/languages/en-US/moderation/clearwarns.json index 233cc644..7e75fea9 100644 --- a/languages/en-US/moderation/clearwarns.json +++ b/languages/en-US/moderation/clearwarns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Clear a member sanctions!", - "USAGE": "{{prefix}}clearwarns [@member]", - "EXAMPLES": "{{prefix}}clearwarns @Jonny_Bro#4226", + "USAGE": "clearwarns [@member]", + "EXAMPLES": "clearwarns @Jonny_Bro#4226", "MISSING_MEMBER": "Please mention the member you wish to remove the sanctions from!", "SUCCESS": "**{{username}}**'s sanctions were deleted!" } \ No newline at end of file diff --git a/languages/en-US/moderation/giveaway.json b/languages/en-US/moderation/giveaway.json index 36233a72..12421a2a 100644 --- a/languages/en-US/moderation/giveaway.json +++ b/languages/en-US/moderation/giveaway.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Easily manage your giveaways!", - "USAGE": "{{prefix}}giveaway [create/reroll/delete/end] (time) (winners count) (prize)", - "EXAMPLES": "{{prefix}}giveaway create 10m 2 5$ PayPal!\n{{prefix}}giveaway reroll 597812898022031374", + "USAGE": "giveaway [create/reroll/delete/end] (time) (winners count) (prize)", + "EXAMPLES": "giveaway create 10m 2 5$ PayPal!\ngiveaway reroll 597812898022031374", "MISSING_STATUS": "You must specify an action between `create`, `reroll`, `end` or `delete`!", - "INVALID_CREATE": "You must enter the information like this: \n\n`{{prefix}}giveaway create [time] [winners count] [prize]`", + "INVALID_CREATE": "You must enter the information like this: \n\n`giveaway create [time] [winners count] [prize]`", "MISSING_ID": "You must enter the giveaway message ID!", "NOT_FOUND": "No giveaway found with message ID `{{messageID}}`", "NOT_FOUND_ENDED": "No **ended** giveaway found with message ID `{{messageID}}`", diff --git a/languages/en-US/moderation/kick.json b/languages/en-US/moderation/kick.json index c44343f0..0d58e936 100644 --- a/languages/en-US/moderation/kick.json +++ b/languages/en-US/moderation/kick.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Kick the mentioned member!", - "USAGE": "{{prefix}}kick [@member] (reason)", - "EXAMPLES": "{{prefix}}kick @Jonny_Bro#4226 Spam", + "USAGE": "kick [@member] (reason)", + "EXAMPLES": "kick @Jonny_Bro#4226 Spam", "MISSING_MEMBER": "Please specify a valid member to kick!", "YOURSELF": "You can't kick yourself!", "MISSING_PERM": "An error has occurred... Please check that I have the permission to kick this specific member and try again!", diff --git a/languages/en-US/moderation/mute.json b/languages/en-US/moderation/mute.json index 5ed3a2a8..6bf091aa 100644 --- a/languages/en-US/moderation/mute.json +++ b/languages/en-US/moderation/mute.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Prevents a member from sending messages and connecting to a voice chat room for a defined period of time!", - "USAGE": "{{prefix}}mute [@member] [time]", - "EXAMPLES": "{{prefix}}mute @Jonny_Bro#4226 Spam", + "USAGE": "mute [@member] [time]", + "EXAMPLES": "mute @Jonny_Bro#4226 Spam", "MISSING_MEMBER": "Please specify a valid member to mute!", "MUTED_DM": "Hello {{username}},\nYou've just been muted on **{{server}}** by **{{moderator}}** for **{{time}}** because of **{{reason}}**!", "MUTED": "**{{username}}** is now muted for **{{time}}** because of **{{reason}}**!", diff --git a/languages/en-US/moderation/poll.json b/languages/en-US/moderation/poll.json index 1dbaed05..b2a3b83c 100644 --- a/languages/en-US/moderation/poll.json +++ b/languages/en-US/moderation/poll.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Launch a survey in the current channel!", - "USAGE": "{{prefix}}poll [question]", - "EXAMPLES": "{{prefix}}poll Is the Earth flat?", + "USAGE": "poll [question]", + "EXAMPLES": "poll Is the Earth flat?", "MISSING_QUESTION": "Please specify a question!", "REACT": "React with {{success}} or {{error}}!", "TITLE": "📊 Poll:" diff --git a/languages/en-US/moderation/setwarns.json b/languages/en-US/moderation/setwarns.json index 7ee3c2d0..c43a8fb4 100644 --- a/languages/en-US/moderation/setwarns.json +++ b/languages/en-US/moderation/setwarns.json @@ -1,12 +1,12 @@ { "DESCRIPTION": "Define the sanctions that members will get after a certain number of warns!", - "USAGE": "{{prefix}}setwarns [kick/ban] [number/reset]", - "EXAMPLES": "{{prefix}}setwarns kick 10\n{{prefix}}setwarns ban 10\n{{prefix}}setwarns ban reset", + "USAGE": "setwarns [kick/ban] [number/reset]", + "EXAMPLES": "setwarns kick 10\nsetwarns ban 10\nsetwarns ban reset", "MISSING_TYPE": "Please specify sanction between `kick` and `ban`", - "SUCCESS_KICK": "** `{{count}}` warnings will result in an expulsion!**\n\n:arrow_right_hook: *Send `{{prefix}}configuration` to see the updated configuration!*", - "SUCCESS_BAN": "** `{{count}}` warnings will result in a ban!**\n\n:arrow_right_hook: *Send `{{prefix}}configuration` to see the updated configuration!*", - "SUCCESS_KICK_RESET": "**Members can no longer be automatically kicked!**\n\n:arrow_right_hook: *Send `{{prefix}}configuration` to see the updated configuration!*", - "SUCCESS_BAN_RESET": "**Members can no longer be automatically banned!**\n\n:arrow_right_hook: *Send `{{prefix}}configuration` to see the updated configuration!*", + "SUCCESS_KICK": "** `{{count}}` warnings will result in an expulsion!**\n\n:arrow_right_hook: *Send `configuration` to see the updated configuration!*", + "SUCCESS_BAN": "** `{{count}}` warnings will result in a ban!**\n\n:arrow_right_hook: *Send `configuration` to see the updated configuration!*", + "SUCCESS_KICK_RESET": "**Members can no longer be automatically kicked!**\n\n:arrow_right_hook: *Send `configuration` to see the updated configuration!*", + "SUCCESS_BAN_RESET": "**Members can no longer be automatically banned!**\n\n:arrow_right_hook: *Send `configuration` to see the updated configuration!*", "AUTO_BAN": "**{{username}}** was automatically banned because they reach more than **{{count}}** warns!", "AUTO_KICK": "**{{username}}** was automatically kicked because they reach more than **{{count}}** warns!" } \ No newline at end of file diff --git a/languages/en-US/moderation/unban.json b/languages/en-US/moderation/unban.json index fe944cf1..5e52ae77 100644 --- a/languages/en-US/moderation/unban.json +++ b/languages/en-US/moderation/unban.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Unban the user from the server!", - "USAGE": "{{prefix}}unban [userID/user#0000]", - "EXAMPLES": "{{prefix}}unban 281361531411890186\n{{prefix}}unban @Jonny_Bro#4226", + "USAGE": "unban [userID/user#0000]", + "EXAMPLES": "unban 281361531411890186\nunban @Jonny_Bro#4226", "MISSING_ID": "Please specify the ID of the member you wish to unban!", "NOT_BANNED": "**{{username}}** is not banned!", "UNBANNED": "**{{username}}** has just been unbanned from **{{server}}**!" diff --git a/languages/en-US/moderation/unmute.json b/languages/en-US/moderation/unmute.json index aed71d6c..9a4e0563 100644 --- a/languages/en-US/moderation/unmute.json +++ b/languages/en-US/moderation/unmute.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Unmute the mentioned member!", - "USAGE": "{{prefix}}unmute [@member]", - "EXAMPLES": "{{prefix}}unmute @Jonny_Bro#4226", + "USAGE": "unmute [@member]", + "EXAMPLES": "unmute @Jonny_Bro#4226", "MISSING_MEMBER": "Please specify the member you want to unmute!", "NOT_MUTED": "**{{username}}** is not muted on this server!", "SUCCESS": "**{{username}}** has just been unmuted!", diff --git a/languages/en-US/moderation/warn.json b/languages/en-US/moderation/warn.json index 790d85cd..7f7d51b8 100644 --- a/languages/en-US/moderation/warn.json +++ b/languages/en-US/moderation/warn.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Warn a member in private messages", - "USAGE": "{{prefix}}warn [@member] [reason]", - "EXAMPLES": "{{prefix}}warn @Jonny_Bro#4226 Dumb", + "USAGE": "warn [@member] [reason]", + "EXAMPLES": "warn @Jonny_Bro#4226 Dumb", "MISSING_MEMBER": "Please specify the member you want to warn!", "YOURSELF": "You can't warn yourself!", "MISSING_REASON": "Please enter a reason!", diff --git a/languages/en-US/moderation/warns.json b/languages/en-US/moderation/warns.json index bfcdf918..c9e21b4a 100644 --- a/languages/en-US/moderation/warns.json +++ b/languages/en-US/moderation/warns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Displays the list of infractions committed by a member!", - "USAGE": "{{prefix}}sanctions [@member]", - "EXAMPLES": "{{prefix}}sanctions @Jonny_Bro#4226", + "USAGE": "sanctions [@member]", + "EXAMPLES": "sanctions @Jonny_Bro#4226", "MISSING_MEMBER": "You must specify a member!", "NO_SANCTION": "**{{username}}** did not receive any sanctions." } \ No newline at end of file diff --git a/languages/en-US/music/autoplay.json b/languages/en-US/music/autoplay.json index a09e2c77..2cac6a99 100644 --- a/languages/en-US/music/autoplay.json +++ b/languages/en-US/music/autoplay.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Enable or disable the autoplay feature", - "USAGE": "{{prefix}}autoplay", - "EXAMPLES": "{{prefix}}autoplay", + "USAGE": "autoplay", + "EXAMPLES": "autoplay", "SUCCESS_ENABLED": "{{success}} Auto play is now enabled!", "SUCCESS_DISABLED": "{{success}} Auto play is now disabled!" } diff --git a/languages/en-US/music/back.json b/languages/en-US/music/back.json index 186d7c47..d312f0fe 100644 --- a/languages/en-US/music/back.json +++ b/languages/en-US/music/back.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Play back the previous song", - "USAGE": "{{prefix}}back", - "EXAMPLES": "{{prefix}}back", + "USAGE": "back", + "EXAMPLES": "back", "NO_PREV_SONG": "There was no song before this one!", "SUCCESS": "Playing previous song!" } \ No newline at end of file diff --git a/languages/en-US/music/clip.json b/languages/en-US/music/clip.json index 755a2427..77451afc 100644 --- a/languages/en-US/music/clip.json +++ b/languages/en-US/music/clip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Play clip", - "USAGE": "{{prefix}}clip [file-name]", - "EXAMPLES": "{{prefix}}clip haha", + "USAGE": "clip [file-name]", + "EXAMPLES": "clip haha", "NO_ARG": "Set file name", "NO_FILE": "File {{file}} is missing!", "ACTIVE_QUEUE": "Can't play clip, another queue is active at the moment" diff --git a/languages/en-US/music/clips.json b/languages/en-US/music/clips.json index dc8f0831..ca154c34 100644 --- a/languages/en-US/music/clips.json +++ b/languages/en-US/music/clips.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Show all available sounds", - "USAGE": "{{prefix}}clips", - "EXAMPLES": "{{prefix}}clips", + "USAGE": "clips", + "EXAMPLES": "clips", "EMBED_TITLE": "**Clip list**" } \ No newline at end of file diff --git a/languages/en-US/music/filter.json b/languages/en-US/music/filter.json index 902cd5d7..8658f2c3 100644 --- a/languages/en-US/music/filter.json +++ b/languages/en-US/music/filter.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Enable or disable a filter", - "USAGE": "{{prefix}}filter [filter]", - "EXAMPLES": "{{prefix}}filter vaporwave", - "MISSING_FILTER": "Please specify a valid filter to enable it! (or send `{{prefix}}filters` to get the statuses of the filters)", - "UNKNOWN_FILTER": "This filter doesn't exist! Send `{{prefix}}filters` to get the list!", + "USAGE": "filter [filter]", + "EXAMPLES": "filter vaporwave", + "MISSING_FILTER": "Please specify a valid filter to enable it! (or send `filters` to get the statuses of the filters)", + "UNKNOWN_FILTER": "This filter doesn't exist! Send `filters` to get the list!", "ADDING_FILTER": "I'm adding the filter to the music, please wait...", "REMOVING_FILTER": "I'm removing the filters from music, please wait..." } \ No newline at end of file diff --git a/languages/en-US/music/filters.json b/languages/en-US/music/filters.json index 219a2ce9..4b405d91 100644 --- a/languages/en-US/music/filters.json +++ b/languages/en-US/music/filters.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Send the list of all the filters and their status", - "USAGE": "{{prefix}}filters", - "EXAMPLES": "{{prefix}}filters", + "USAGE": "filters", + "EXAMPLES": "filters", "TITLE": "**Filters**", - "CONTENT": "Here is the list of all filters enabled or disabled.\nUse `{{prefix}}filter` to change the status of one of them." + "CONTENT": "Here is the list of all filters enabled or disabled.\nUse `filter` to change the status of one of them." } \ No newline at end of file diff --git a/languages/en-US/music/jump.json b/languages/en-US/music/jump.json index 473c6733..666d4b2a 100644 --- a/languages/en-US/music/jump.json +++ b/languages/en-US/music/jump.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Jump to the given track in the queue", - "USAGE": "{{prefix}}jump [number]", - "EXAMPLES": "{{prefix}}jump 3", - "NO_PREV_SONG": "You can't go back, use `{{prefix}}back`!", + "USAGE": "jump [number]", + "EXAMPLES": "jump 3", + "NO_PREV_SONG": "You can't go back, use `back`!", "SUCCESS": "Playing selected track!" } \ No newline at end of file diff --git a/languages/en-US/music/loop.json b/languages/en-US/music/loop.json index 2367d15e..047aa5ed 100644 --- a/languages/en-US/music/loop.json +++ b/languages/en-US/music/loop.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Turn on/off repeat of queue/current track!", - "USAGE": "{{prefix}}loop [queue/song]", - "EXAMPLES": "{{prefix}}loop queue\n{{prefix}}loop song", + "USAGE": "loop [queue/song]", + "EXAMPLES": "loop queue\nloop song", "NO_ARG": "Select: `queue` or `song`!", "QUEUE": "Repeat of queue is **enabled**!", "SONG": "Repeat of current track is **enabled**!", diff --git a/languages/en-US/music/lyrics.json b/languages/en-US/music/lyrics.json index f73e9882..375e1b45 100644 --- a/languages/en-US/music/lyrics.json +++ b/languages/en-US/music/lyrics.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows the song lyrics", - "USAGE": "{{prefix}}lyrics [song-name]", - "EXAMPLES": "{{prefix}}lyrics Skyfall", + "USAGE": "lyrics [song-name]", + "EXAMPLES": "lyrics Skyfall", "LYRICS_OF": "🎤 {{songName}} lyrics", "AND_MORE": "\n**And more...**", "CLICK_HERE": "Click here for full lyrics", diff --git a/languages/en-US/music/np.json b/languages/en-US/music/np.json index 38cb7fc5..25628bea 100644 --- a/languages/en-US/music/np.json +++ b/languages/en-US/music/np.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Shows information about the current song!", - "USAGE": "{{prefix}}np", - "EXAMPLES": "{{prefix}}np", + "USAGE": "np", + "EXAMPLES": "np", "CURRENTLY_PLAYING": "Currently playing", "T_TITLE": "Title", "T_CHANNEL": "Channel", diff --git a/languages/en-US/music/pause.json b/languages/en-US/music/pause.json index 455f02f0..c247dcea 100644 --- a/languages/en-US/music/pause.json +++ b/languages/en-US/music/pause.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Pause the current song!", - "USAGE": "{{prefix}}pause", - "EXAMPLES": "{{prefix}}pause", + "USAGE": "pause", + "EXAMPLES": "pause", "SUCCESS": "⏸️ Music paused." } \ No newline at end of file diff --git a/languages/en-US/music/play.json b/languages/en-US/music/play.json index 61bdce33..e8dfccd3 100644 --- a/languages/en-US/music/play.json +++ b/languages/en-US/music/play.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Plays music for you!", - "USAGE": "{{prefix}}play [song]", - "EXAMPLES": "{{prefix}}play Bye Bye", + "USAGE": "play [song]", + "EXAMPLES": "play Bye Bye", "NO_VOICE_CHANNEL": "You must be connected to a voice channel!", "VOICE_CHANNEL_CONNECT": "I can't connect to your voice channel!", "MISSING_SONG_NAME": "Please specify a song name or a link!", diff --git a/languages/en-US/music/queue.json b/languages/en-US/music/queue.json index e300ccc8..f74fd4d5 100644 --- a/languages/en-US/music/queue.json +++ b/languages/en-US/music/queue.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Shows the server queue", - "USAGE": "{{prefix}}queue", - "EXAMPLES": "{{prefix}}queue", + "USAGE": "queue", + "EXAMPLES": "queue", "TITLE": "Server Queue" } \ No newline at end of file diff --git a/languages/en-US/music/resume.json b/languages/en-US/music/resume.json index 3f412deb..45b472fe 100644 --- a/languages/en-US/music/resume.json +++ b/languages/en-US/music/resume.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Resume the current song!", - "USAGE": "{{prefix}}resume", - "EXAMPLES": "{{prefix}}resume", + "USAGE": "resume", + "EXAMPLES": "resume", "SUCCESS": "▶️ Music resumed!" } \ No newline at end of file diff --git a/languages/en-US/music/seek.json b/languages/en-US/music/seek.json index abfd6f49..e207439f 100644 --- a/languages/en-US/music/seek.json +++ b/languages/en-US/music/seek.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Go forward or backward a specific amount of time in the current song!!", - "USAGE": "{{prefix}}seek [time]", - "EXAMPLES": "{{prefix}}resume 10s", + "USAGE": "seek [time]", + "EXAMPLES": "resume 10s", "INVALID_TIME": "You must specify a valid number of time!", "SUCCESS": "▶️ Music sought!" } \ No newline at end of file diff --git a/languages/en-US/music/skip.json b/languages/en-US/music/skip.json index 7a368095..ae79d558 100644 --- a/languages/en-US/music/skip.json +++ b/languages/en-US/music/skip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Skip the current song", - "USAGE": "{{prefix}}skip", - "EXAMPLES": "{{prefix}}skip", + "USAGE": "skip", + "EXAMPLES": "skip", "NO_NEXT_SONG": "There's no song after this one!", "SUCCESS": "Song skipped!" } \ No newline at end of file diff --git a/languages/en-US/music/stop.json b/languages/en-US/music/stop.json index fd1565d3..a8d04d6d 100644 --- a/languages/en-US/music/stop.json +++ b/languages/en-US/music/stop.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Stop the music", - "USAGE": "{{prefix}}stop", - "EXAMPLES": "{{prefix}}stop", + "USAGE": "stop", + "EXAMPLES": "stop", "VOTE_CONTENT": "React with 👍 to stop the music! {{requiredCount}} more votes are required.", "SUCCESS": "Music stopped!" } \ No newline at end of file diff --git a/languages/en-US/nsfw/hentai.json b/languages/en-US/nsfw/hentai.json index 217027b6..b6a1c045 100644 --- a/languages/en-US/nsfw/hentai.json +++ b/languages/en-US/nsfw/hentai.json @@ -1,8 +1,8 @@ { "DESCRIPTION": "Get NSFW gif", - "USAGE": "{{prefix}}hentai (category/help)", - "EXAMPLES": "{{prefix}}hentai\n{{prefix}}hentai help", - "NOCATEGORY": "If you want to see something from certain category, type its name after command.\nUse **`{{prefix}}hentai help`** to see all categories\n", + "USAGE": "hentai (category/help)", + "EXAMPLES": "hentai\nhentai help", + "NOCATEGORY": "If you want to see something from certain category, type its name after command.\nUse **`hentai help`** to see all categories\n", "HELP_1": "Available categories (You can also use command without any arguments)", "HELP_2": "```neko\ncum\nsolo\nanal\nyuri\nblowjob - bj\npussy\nclassic\nfutanari - futa\n```" } \ No newline at end of file diff --git a/languages/en-US/owner/debug.json b/languages/en-US/owner/debug.json index 579d2ebb..a2aa0325 100644 --- a/languages/en-US/owner/debug.json +++ b/languages/en-US/owner/debug.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Allows to change user data!", - "USAGE": "{{prefix}}debug [set/add] [level/xp/credits/bank/rep] [@user] [value]", - "EXAMPLES": "{{prefix}}debug set level @Jonny_Bro#4226 10000", + "USAGE": "debug [set/add] [level/xp/credits/bank/rep] [@user] [value]", + "EXAMPLES": "debug set level @Jonny_Bro#4226 10000", "INVALID_MEMBER": "You must mention the user!", "NO_ACTION": "Select an option: `set` or `add`!", "NO_STATUS": "Select a parameter: `level`, `xp`, `credits`, `rep` или `bank`!", diff --git a/languages/en-US/owner/eval.json b/languages/en-US/owner/eval.json index b9e079ac..122f2ea8 100644 --- a/languages/en-US/owner/eval.json +++ b/languages/en-US/owner/eval.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Executes the given code", - "USAGE": "{{prefix}}eval [code]", - "EXAMPLES": "{{prefix}}eval message.author.send(message.client.token);" + "USAGE": "eval [code]", + "EXAMPLES": "eval message.author.send(message.client.token);" } \ No newline at end of file diff --git a/languages/en-US/owner/reload.json b/languages/en-US/owner/reload.json index 00bcda3e..5ef4ee8a 100644 --- a/languages/en-US/owner/reload.json +++ b/languages/en-US/owner/reload.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Reload a command!", - "USAGE": "{{prefix}}reload", - "EXAMPLES": "{{prefix}}reload", + "USAGE": "reload", + "EXAMPLES": "reload", "NOT_FOUND": "`{{search}}` is not an available command!", "SUCCESS": "Command successfully reloaded!" } \ No newline at end of file diff --git a/languages/en-US/owner/say.json b/languages/en-US/owner/say.json index 40778300..b439ded6 100644 --- a/languages/en-US/owner/say.json +++ b/languages/en-US/owner/say.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Send a message on behalf of the bot!", - "USAGE": "{{prefix}}say [text] ++ (ID/channel-name) ++ (ID/server-name)", - "EXAMPLES": "{{prefix}}say Hello World!\n{{prefix}}say Hello World! ++ 123456789098765432" + "USAGE": "say [text] ++ (ID/channel-name) ++ (ID/server-name)", + "EXAMPLES": "say Hello World!\nsay Hello World! ++ 123456789098765432" } \ No newline at end of file diff --git a/languages/en-US/owner/servers-list.json b/languages/en-US/owner/servers-list.json index cd35a23e..404cacd9 100644 --- a/languages/en-US/owner/servers-list.json +++ b/languages/en-US/owner/servers-list.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Show the servers list!", - "USAGE": "{{prefix}}servers-list", - "EXAMPLES": "{{prefix}}servers-list" + "USAGE": "servers-list", + "EXAMPLES": "servers-list" } \ No newline at end of file diff --git a/languages/ru-RU/administration/addcommand.json b/languages/ru-RU/administration/addcommand.json index d3b3be19..160aebe1 100644 --- a/languages/ru-RU/administration/addcommand.json +++ b/languages/ru-RU/administration/addcommand.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Создать свою команду!", - "USAGE": "{{prefix}}addcommand [название] [ответ]", - "EXAMPLES": "{{prefix}}addcommand hello Привет, {user}. Добро пожаловать на {guild}!", + "USAGE": "addcommand [название] [ответ]", + "EXAMPLES": "addcommand hello Привет, {user}. Добро пожаловать на {guild}!", "MISSING_NAME": "Укажите название команды!", "MISSING_ANSWER": "Укажите ответ команды!", "SUCCESS": "Команда **{{commandName}}** создана!" diff --git a/languages/ru-RU/administration/addemoji.json b/languages/ru-RU/administration/addemoji.json index fd9a8e14..fa633b71 100644 --- a/languages/ru-RU/administration/addemoji.json +++ b/languages/ru-RU/administration/addemoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Добавить эмодзи на сервер!", - "USAGE": "{{prefix}}addemoji [ссылка-на-изображение] [название]", - "EXAMPLES": "{{prefix}}addemoji https://via.placeholder.com/150 placeholder", + "USAGE": "addemoji [ссылка-на-изображение] [название]", + "EXAMPLES": "addemoji https://via.placeholder.com/150 placeholder", "MISSING_URL": "Укажите ссылку на изображение!", "MISSING_NAME": "Укажите название эмодзи!", "INVALID_NAME": "Название эмодзи должно быть от 2 до 32 символов!", diff --git a/languages/ru-RU/administration/automod.json b/languages/ru-RU/administration/automod.json index c44b64d3..e5041dc9 100644 --- a/languages/ru-RU/administration/automod.json +++ b/languages/ru-RU/administration/automod.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Включить или отключить автоудаление Discord приглашений", - "USAGE": "{{prefix}}automod [on/off] (#канал)", - "EXAMPLES": "{{prefix}}automod on\n{{prefix}}automod off #general\n{{prefix}}automod off", + "USAGE": "automod [on/off] (#канал)", + "EXAMPLES": "automod on\nautomod off #general\nautomod off", "MISSING_STATUS": "Укажите значение `on` или `off`!", - "ENABLED": "**Discord приглашения будут автоматически удаляться!**\n\n:arrow_right_hook: *Используйте `{{prefix}}automod off #channel`, чтобы игнорировать канал!*", + "ENABLED": "**Discord приглашения будут автоматически удаляться!**\n\n:arrow_right_hook: *Используйте `automod off #channel`, чтобы игнорировать канал!*", "DISABLED_CHANNEL": "Автомодерация не будет выполняться в {{channel}}!", "DISABLED": "Автомодерация отключена на данном сервере!", "DELETED": "Ваше сообщение было удалено, т.к. содержало в себе ссылку-приглашение!" diff --git a/languages/ru-RU/administration/autorole.json b/languages/ru-RU/administration/autorole.json index b7a3470d..afeafcfa 100644 --- a/languages/ru-RU/administration/autorole.json +++ b/languages/ru-RU/administration/autorole.json @@ -1,10 +1,10 @@ { "DESCRIPTION": "Включить или отключить автоназначение роли при входе на сервер!", - "USAGE": "{{prefix}}autorole [on/off] (@роль)", - "EXAMPLES": "{{prefix}}autorole on @новенький\n{{prefix}}autorole off", + "USAGE": "autorole [on/off] (@роль)", + "EXAMPLES": "autorole on @новенький\nautorole off", "MISSING_STATUS": "Укажите значение `on` или `off`!", "MISSING_ROLE": "Укажите роль!", "SUCCESS_ENABLED": "Автоназначение роли включено! Новые пользователи будут автоматически получать **{{roleName}}** при входе на сервер.", - "ALREADY_DISABLED": "**Автоназначение роли уже отключено.**\n\n:arrow_right_hook: *Используйте `{{prefix}}autorole on @роль`, чтобы включить!*", - "SUCCESS_DISABLED": "**Автоназначение роли отключено!**\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*" + "ALREADY_DISABLED": "**Автоназначение роли уже отключено.**\n\n:arrow_right_hook: *Используйте `autorole on @роль`, чтобы включить!*", + "SUCCESS_DISABLED": "**Автоназначение роли отключено!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*" } \ No newline at end of file diff --git a/languages/ru-RU/administration/backup.json b/languages/ru-RU/administration/backup.json index 69d59693..7fdedb7f 100644 --- a/languages/ru-RU/administration/backup.json +++ b/languages/ru-RU/administration/backup.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Управление резервными копиями сервера!", - "USAGE": "{{prefix}}backup [create/load/info/remove]", - "EXAMPLES": "{{prefix}}backup create\n{{prefix}}backup load 123456789098765432\n{{prefix}}backup info 123456789098765432", + "USAGE": "backup [create/load/info/remove]", + "EXAMPLES": "backup create\nbackup load 123456789098765432\nbackup info 123456789098765432", "MISSING_STATUS": "Выберите действие: `create`, `load`, `info` или `remove`!", "MISSING_BACKUP_ID": "Укажите ID резервной копии!", "NO_BACKUP_FOUND": "Резервных копий с ID `{{backupID}}` не найдено", diff --git a/languages/ru-RU/administration/configuration.json b/languages/ru-RU/administration/configuration.json index b80c0655..e8b5b2ee 100644 --- a/languages/ru-RU/administration/configuration.json +++ b/languages/ru-RU/administration/configuration.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать конфигурацию сервера!", - "USAGE": "{{prefix}}configuration", - "EXAMPLES": "{{prefix}}configuration", + "USAGE": "configuration", + "EXAMPLES": "configuration", "PREFIX_TITLE": "Префикс", "IGNORED_CHANNELS_TITLE": "Игнорируемые каналы", "NO_IGNORED_CHANNELS": "Нет игнорируемых каналов.", diff --git a/languages/ru-RU/administration/delcommand.json b/languages/ru-RU/administration/delcommand.json index 12e1f9c9..f7f4a691 100644 --- a/languages/ru-RU/administration/delcommand.json +++ b/languages/ru-RU/administration/delcommand.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Удалить свою команду!", - "USAGE": "{{prefix}}delcommand [название]", - "EXAMPLES": "{{prefix}}delcommand hello", + "USAGE": "delcommand [название]", + "EXAMPLES": "delcommand hello", "MISSING_NAME": "Введите название команды!", "UNKNOWN_COMMAND": "Команда {{commandName}} не существует!", "SUCCESS": "Команда **{{commandName}}** была удалена с сервера!" diff --git a/languages/ru-RU/administration/deletemod.json b/languages/ru-RU/administration/deletemod.json index c3c941f9..64f837b8 100644 --- a/languages/ru-RU/administration/deletemod.json +++ b/languages/ru-RU/administration/deletemod.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Включить или отключить автоудаление команд модерации!", - "USAGE": "{{prefix}}deletemod [on/off]", - "EXAMPLES": "{{prefix}}deletemod on", + "USAGE": "deletemod [on/off]", + "EXAMPLES": "deletemod on", "MISSING_STATUS": "Укажите значение `on` или `off`!", "ENABLED": "Автоудаление команд модерации включено!", "DISABLED": "Автоудаление команд модерации отключено!" diff --git a/languages/ru-RU/administration/goodbye.json b/languages/ru-RU/administration/goodbye.json index b7b6512b..52ed1644 100644 --- a/languages/ru-RU/administration/goodbye.json +++ b/languages/ru-RU/administration/goodbye.json @@ -1,16 +1,16 @@ { "DESCRIPTION": "Включить или отключить сообщения при выходе пользователя с сервера!", - "USAGE": "{{prefix}}goodbye (edit/off/test)", - "EXAMPLES": "{{prefix}}goodbye\n{{prefix}}goodbye test", + "USAGE": "goodbye (edit/off/test)", + "EXAMPLES": "goodbye\ngoodbye test", "MISSING_STATUS": "Выберите действие: `edit`, `off` или `test`!", "DEFAULT_MESSAGE": "Пока, {user}! Нас теперь {membercount} без тебя :'(", "TEST_SUCCESS": "Тест выполнен!", "FORM_1": "**В какой канал будут отправляться сообщения?**\n\n:arrow_right_hook: *Отправьте упоминание канала!*", "FORM_2": "**Укажите ваше сообщение.**\n\n**Если необходимо:**\n*-* __Упомянуть пользователя__: {user}\n*-* __Количество участников__: {membercount}\n*-* __Название сервера__: {server}\n\n**Например:**\nПрощай, {user}, мы будем скучать! Теперь нас {membercount}.\n:fast_forward:\nПрощай, {{author}}, мы будем скучать! Теперь нас {{memberCount}}.", "FORM_3": "**Вы хотите добавить карточку к сообщению?**\n\n:arrow_right_hook: *Отправьте `да` или `нет`!*", - "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Используйте `{{prefix}}goodbye test` для предпросмотра вашего сообщения!*", + "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Используйте `goodbye test` для предпросмотра вашего сообщения!*", "MAX_CHARACT": "Ваше сообщение должно быть не более 1800 символов!", - "DISABLED": "**Сообщения отключены!**\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*", + "DISABLED": "**Сообщения отключены!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", "IMG_GOODBYE": "Вышел с {{server}}!", "TITLE": "До встречи!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/ignore.json b/languages/ru-RU/administration/ignore.json index 0017682a..9247c31c 100644 --- a/languages/ru-RU/administration/ignore.json +++ b/languages/ru-RU/administration/ignore.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Включить или отключить использование команд в канале", - "USAGE": "{{prefix}}ignore [канал]", - "EXAMPLES": "{{prefix}}ignore #основной", + "USAGE": "ignore [канал]", + "EXAMPLES": "ignore #основной", "ALLOWED": "Теперь команды в {{channel}} разрешены!", "IGNORED": "Теперь команды в {{channel}} запрещены!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/set.json b/languages/ru-RU/administration/set.json index 6f37c9ae..b3521708 100644 --- a/languages/ru-RU/administration/set.json +++ b/languages/ru-RU/administration/set.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Изменить пользователю опыт, уровень, кредиты или банк!", - "USAGE": "{{prefix}}set [level/xp/credits/bank] [@пользователь] [значение]", - "EXAMPLES": "{{prefix}}set level @Jonny_Bro#4226 10", + "USAGE": "set [level/xp/credits/bank] [@пользователь] [значение]", + "EXAMPLES": "set level @Jonny_Bro#4226 10", "INVALID_MEMBER": "Вы должны упомянуть пользователя!", "NO_STATUS": "Выберите значение: `level`, `xp`, `credits` или `bank`!", "BOT_USER": "Вы не можете изменить статистику бота!", diff --git a/languages/ru-RU/administration/setbirthdays.json b/languages/ru-RU/administration/setbirthdays.json index c6a90630..bd72d1e7 100644 --- a/languages/ru-RU/administration/setbirthdays.json +++ b/languages/ru-RU/administration/setbirthdays.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Установить канал для поздравлений с днём рождения!", - "USAGE": "{{prefix}}setbirthdays (#канал)", - "EXAMPLES": "{{prefix}}setbirthdays #дни-рождения\n{{prefix}}setbirthdays", + "USAGE": "setbirthdays (#канал)", + "EXAMPLES": "setbirthdays #дни-рождения\nsetbirthdays", "ENABLED": "Поздравления включены в канале **{{channel}}**!", "DISABLED": "Поздравления отключены!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/setlang.json b/languages/ru-RU/administration/setlang.json index 3314b1e4..f20471b3 100644 --- a/languages/ru-RU/administration/setlang.json +++ b/languages/ru-RU/administration/setlang.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Изменить язык бота на сервере!", - "USAGE": "{{prefix}}setlang [язык]", - "EXAMPLES": "{{prefix}}setlang ru\n{{prefix}}setlang uk", + "USAGE": "setlang [язык]", + "EXAMPLES": "setlang ru\nsetlang uk", "MISSING_LANG": "Выберите язык из списка: {{list}}", "SUCCESS": ":flag_ru: Язык сервера изменён на **{{lang}}**!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/setmodlogs.json b/languages/ru-RU/administration/setmodlogs.json index 603e1c74..f7f4bb87 100644 --- a/languages/ru-RU/administration/setmodlogs.json +++ b/languages/ru-RU/administration/setmodlogs.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Установить канал для логов модерации!", - "USAGE": "{{prefix}}setmodlogs (#канал)", - "EXAMPLES": "{{prefix}}setmodlogs #логи\n{{prefix}}setmodlogs", + "USAGE": "setmodlogs (#канал)", + "EXAMPLES": "setmodlogs #логи\nsetmodlogs", "ENABLED": "Логи модерации включены в канале **{{channel}}**!", "DISABLED": "Логи модерации отключены!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/setprefix.json b/languages/ru-RU/administration/setprefix.json index 9593a33e..e3bfb759 100644 --- a/languages/ru-RU/administration/setprefix.json +++ b/languages/ru-RU/administration/setprefix.json @@ -1,8 +1,8 @@ { "DESCRIPTION": "Установить префикс на сервере!", - "USAGE": "{{prefix}}setprefix [префикс]", - "EXAMPLES": "{{prefix}}setprefix $", + "USAGE": "setprefix [префикс]", + "EXAMPLES": "setprefix $", "MISSING_PREFIX": "Укажите префикс!", "TOO_LONG": "Префикс не может быть длиннее 5 символов!", - "SUCCESS": "Префикс бота изменён на `{{prefix}}`!" + "SUCCESS": "Префикс бота изменён на ``!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/setreports.json b/languages/ru-RU/administration/setreports.json index 1e832aff..f014fb44 100644 --- a/languages/ru-RU/administration/setreports.json +++ b/languages/ru-RU/administration/setreports.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Установить канал для жалоб!", - "USAGE": "{{prefix}}setreports (#канал)", - "EXAMPLES": "{{prefix}}setreports #жалобы\n{{prefix}}setreports", + "USAGE": "setreports (#канал)", + "EXAMPLES": "setreports #жалобы\nsetreports", "ENABLED": "Жалобы будут отправляться в **{{channel}}**!", "DISABLED": "Жалобы отключены!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/setsuggests.json b/languages/ru-RU/administration/setsuggests.json index 25c7f256..b7190f3c 100644 --- a/languages/ru-RU/administration/setsuggests.json +++ b/languages/ru-RU/administration/setsuggests.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Установить канал для предложений!", - "USAGE": "{{prefix}}setsuggests (#канал)", - "EXAMPLES": "{{prefix}}setsuggests #предложения\n{{prefix}}setsuggests", + "USAGE": "setsuggests (#канал)", + "EXAMPLES": "setsuggests #предложения\nsetsuggests", "ENABLED": "Предложения будут отправляться в **{{channel}}**!", "DISABLED": "Предложения отключены!" } \ No newline at end of file diff --git a/languages/ru-RU/administration/stealemoji.json b/languages/ru-RU/administration/stealemoji.json index 1c6aff8a..6977fd55 100644 --- a/languages/ru-RU/administration/stealemoji.json +++ b/languages/ru-RU/administration/stealemoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Украсть эмодзи на данный сервер с другого!", - "USAGE": "{{prefix}}stealemoji [эмодзи]", - "EXAMPLES": "{{prefix}}stealemoji :coolstorybob:", + "USAGE": "stealemoji [эмодзи]", + "EXAMPLES": "stealemoji :coolstorybob:", "MISSING_EMOJI": "Укажите эмодзи!", "SUCCESS": "{{emoji}} добавлен!", "ERROR": "{{emoji}} не был добавлен. Проверьте, есть ли место для добавления эмодзи!" diff --git a/languages/ru-RU/administration/welcome.json b/languages/ru-RU/administration/welcome.json index 69c254c8..bf1a6abd 100644 --- a/languages/ru-RU/administration/welcome.json +++ b/languages/ru-RU/administration/welcome.json @@ -1,16 +1,16 @@ { "DESCRIPTION": "Включить или отключить сообщения при входе пользователя на сервер!", - "USAGE": "{{prefix}}welcome (edit/off/test)", - "EXAMPLES": "{{prefix}}welcome\n{{prefix}}welcome test", + "USAGE": "welcome (edit/off/test)", + "EXAMPLES": "welcome\nwelcome test", "MISSING_STATUS": "Выберите действие: `edit`, `off` или `test`!", "DEFAULT_MESSAGE": "Добро пожаловать в {server}, {user}, теперь нас {membercount}! Ваш аккаунт был создан {createdat}.", "TEST_SUCCESS": "Тест выполнен!", "FORM_1": "**В какой канал будут отправляться сообщения?**\n\n:arrow_right_hook: *Отправьте упоминание канала!*", "FORM_2": "**Укажите ваше сообщение.**\n\n**Если необходимо:**\n*-* __Упомянуть пользователя__: {user}\n*-* __Количество участников__: {membercount}\n*-* __Название сервера__: {server}\n\n**Например:**\nДобро пожаловать на сервер {server}, {user}! Теперь нас {membercount}!\n:fast_forward:\nДобро пожаловать на сервер {{guildName}}, {{author}}! Теперь нас {{memberCount}}!", "FORM_3": "**Вы хотите добавить карточку к сообщению?**\n\n:arrow_right_hook: *Отправьте `да` или `нет`!*", - "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Используйте `{{prefix}}welcome test` для предпросмотра вашего приветственного сообщения!*", + "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Используйте `welcome test` для предпросмотра вашего приветственного сообщения!*", "MAX_CHARACT": "Ваше сообщение должно быть не более 1800 символов!", - "DISABLED": "**Сообщения отключены!**\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*", + "DISABLED": "**Сообщения отключены!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", "IMG_WELCOME": "Добро пожаловать в {{server}}!", "TITLE": "Добро пожаловать!" } \ No newline at end of file diff --git a/languages/ru-RU/economy/achievements.json b/languages/ru-RU/economy/achievements.json index cad71a68..2e6923e3 100644 --- a/languages/ru-RU/economy/achievements.json +++ b/languages/ru-RU/economy/achievements.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать список ваших достижений!", - "USAGE": "{{prefix}}achievements", - "EXAMPLES": "{{prefix}}achievements", + "USAGE": "achievements", + "EXAMPLES": "achievements", "SEND_CMD": "Используйте свою первую команду!", "CLAIM_SALARY": "Получите зарплату 10 раз!", "MARRY": "Найдите свою половинку и женитесь!", diff --git a/languages/ru-RU/economy/birthdate.json b/languages/ru-RU/economy/birthdate.json index 499a2e92..35703a83 100644 --- a/languages/ru-RU/economy/birthdate.json +++ b/languages/ru-RU/economy/birthdate.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Установить дату рождения", - "USAGE": "{{prefix}}birthdate [ДД/ММ/ГГГГ]", - "EXAMPLES": "{{prefix}}birthdate 01/01/2010", + "USAGE": "birthdate [ДД/ММ/ГГГГ]", + "EXAMPLES": "birthdate 01/01/2010", "MISSING_DATE": "Укажите дату в формате 20/11/2003", "INVALID_DATE": "Используйте данный формат: ДД/ММ/ГГГГ. Например, `1 января 2010` будет `01/01/2010`.", "DATE_TOO_LOW": "Вам больше 80 лет? :eyes:", diff --git a/languages/ru-RU/economy/deposit.json b/languages/ru-RU/economy/deposit.json index 976109bc..63fc4074 100644 --- a/languages/ru-RU/economy/deposit.json +++ b/languages/ru-RU/economy/deposit.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Внести кредиты в банк", - "USAGE": "{{prefix}}deposit [сумма/all]", - "EXAMPLES": "{{prefix}}deposit 1000\n{{prefix}}deposit all", + "USAGE": "deposit [сумма/all]", + "EXAMPLES": "deposit 1000\ndeposit all", "MISSING_AMOUNT": "Укажите сумму!", "NO_CREDIT": "У вас нет кредитов!", "NOT_ENOUGH_CREDIT": "У вас нет `{{money}}`!", diff --git a/languages/ru-RU/economy/divorce.json b/languages/ru-RU/economy/divorce.json index 84731fdb..a226f7c8 100644 --- a/languages/ru-RU/economy/divorce.json +++ b/languages/ru-RU/economy/divorce.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Развестись с пользователем!", - "USAGE": "{{prefix}}divorce", - "EXAMPLES": "{{prefix}}divorce", + "USAGE": "divorce", + "EXAMPLES": "divorce", "NOT_MARRIED": "Вы не состоите в браке!", "DIVORCED": "Вы развелись с **{{username}}**!", "DIVORCED_U": "**{{username}}** развёлся с вами!" diff --git a/languages/ru-RU/economy/findwords.json b/languages/ru-RU/economy/findwords.json index 222b9914..048bad96 100644 --- a/languages/ru-RU/economy/findwords.json +++ b/languages/ru-RU/economy/findwords.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Угадай загаданное мною слово!", - "USAGE": "{{prefix}}findwords (STOP)", - "EXAMPLES": "{{prefix}}findwords", + "USAGE": "findwords (STOP)", + "EXAMPLES": "findwords", "INVALID_WORD": "{{member}} | Данное слово не существует или я его не знаю :(", "GAME_STARTING": ":timer: | Игра начнётся через 10 секунд!\nНапишите STOP, если хотите остановить игру!", "FIND_WORD": "20 секунд чтобы найти слово, в котором есть **{{word}}**!", diff --git a/languages/ru-RU/economy/horserace.json b/languages/ru-RU/economy/horserace.json index 0ee1650c..6c40f9d2 100644 --- a/languages/ru-RU/economy/horserace.json +++ b/languages/ru-RU/economy/horserace.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Конные скачки!", - "USAGE": "{{prefix}}horserace [create/bet/go]", - "EXAMPLES": "{{prefix}}horserace create\n{{prefix}}horserace bet 3 100", + "USAGE": "horserace [create/bet/go]", + "EXAMPLES": "horserace create\nhorserace bet 3 100", "MISSING_STATUS": "Выберите параметр: `create`, `bet` или `go`!", "HORSE_NUM": "На скачках всего 5 лошадей!", "EMBED_T": "Конные скачки", diff --git a/languages/ru-RU/economy/leaderboard.json b/languages/ru-RU/economy/leaderboard.json index 319c367c..ac9902a2 100644 --- a/languages/ru-RU/economy/leaderboard.json +++ b/languages/ru-RU/economy/leaderboard.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать таблице лидеров по кредитам, уровню или очкам репутации!", - "USAGE": "{{prefix}}leaderboard [rep/level/credits]", - "EXAMPLES": "{{prefix}}leaderboard credits\n{{prefix}}leaderboard level", + "USAGE": "leaderboard [rep/level/credits]", + "EXAMPLES": "leaderboard credits\nleaderboard level", "MISSING_TYPE": "Выберите таблицу: `credits`, `level` или `rep`!", "MOBILE": ":confused: Я заметил, что вы онлайн с телефона... Таблица лидеров может отображаться некорректно на маленьких экранах. Попробуйте позже с другого устройства!", "TABLE": "Таблица лидеров {{name}}", diff --git a/languages/ru-RU/economy/marry.json b/languages/ru-RU/economy/marry.json index 8c61d128..30397dbf 100644 --- a/languages/ru-RU/economy/marry.json +++ b/languages/ru-RU/economy/marry.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Женитесь на том, кого любите!", - "USAGE": "{{prefix}}marry [@пользователь]", - "EXAMPLES": "{{prefix}}marry @Jonny_Bro#4226", + "USAGE": "marry [@пользователь]", + "EXAMPLES": "marry @Jonny_Bro#4226", "INVALID_MEMBER": "Вы должны упомянуть пользователя!", - "ALREADY_MARRIED": "Вы уже состоите в браке! Вы можете развестить с помощью команды `{{prefix}}divorce`.", + "ALREADY_MARRIED": "Вы уже состоите в браке! Вы можете развестить с помощью команды `divorce`.", "ALREADY_MARRIED_USER": "Место занято! **{{username}}** уже состоит в браке!", "YOURSELF": "Вы не можете жениться на себе!", "REQUEST_AUTHOR_TO_AMEMBER": "Вы уже отправили предложение **{{username}}**!", diff --git a/languages/ru-RU/economy/money.json b/languages/ru-RU/economy/money.json index e129ce5e..65fa69ed 100644 --- a/languages/ru-RU/economy/money.json +++ b/languages/ru-RU/economy/money.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показать количество кредитов у пользователя", - "USAGE": "{{prefix}}money (@пользователь)", - "EXAMPLES": "{{prefix}}money\n{{prefix}}money @Jonny_Bro#4226", + "USAGE": "money (@пользователь)", + "EXAMPLES": "money\nmoney @Jonny_Bro#4226", "TITLE": "Кредиты {{username}}" } \ No newline at end of file diff --git a/languages/ru-RU/economy/number.json b/languages/ru-RU/economy/number.json index 1698f287..e45de731 100644 --- a/languages/ru-RU/economy/number.json +++ b/languages/ru-RU/economy/number.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Угадай загаданное мною число!", - "USAGE": "{{prefix}}number (STOP)", - "EXAMPLES": "{{prefix}}number", + "USAGE": "number (STOP)", + "EXAMPLES": "number", "GAME_START": "Я загадал число, начинайте!\nНапишите STOP, если хотите остановить игру!", "BIG": "{{user}} | Моё число **больше** чем `{{number}}`!", "SMALL": "{{user}} | Моё число **меньше** чем `{{number}}`!", diff --git a/languages/ru-RU/economy/pay.json b/languages/ru-RU/economy/pay.json index 118bdb6e..99573a24 100644 --- a/languages/ru-RU/economy/pay.json +++ b/languages/ru-RU/economy/pay.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отправить кредиты пользователю!", - "USAGE": "{{prefix}}pay [@пользователь] [сумма]", - "EXAMPLES": "{{prefix}}pay @Jonny_Bro#4226 1000", + "USAGE": "pay [@пользователь] [сумма]", + "EXAMPLES": "pay @Jonny_Bro#4226 1000", "INVALID_MEMBER": "Вы должны упомянуть пользователя!", "BOT_USER": "Ботам не нужны кредиты!", "YOURSELF": "Вы не можете заплатить самому себе!", diff --git a/languages/ru-RU/economy/profile.json b/languages/ru-RU/economy/profile.json index 1497f650..7498e7ac 100644 --- a/languages/ru-RU/economy/profile.json +++ b/languages/ru-RU/economy/profile.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать профиль пользователя", - "USAGE": "{{prefix}}profile (@пользователь)", - "EXAMPLES": "{{prefix}}profile\n{{prefix}}profile @Jonny_Bro#4226", + "USAGE": "profile (@пользователь)", + "EXAMPLES": "profile\nprofile @Jonny_Bro#4226", "BOT_USER": "У ботов нет профиля!", "TITLE": "Профиль {{username}}", "LINK": "Профиль", @@ -20,5 +20,5 @@ "REGISTERED": "📅 Профиль создан", "NO_LOVER": "Свободен", "ACHIEVEMENTS": "🔥 Достижения", - "ACHIEVEMENTS_CONTENT": "Получите больше информации с помощью `{{prefix}}achievements`!" + "ACHIEVEMENTS_CONTENT": "Получите больше информации с помощью `achievements`!" } \ No newline at end of file diff --git a/languages/ru-RU/economy/rep.json b/languages/ru-RU/economy/rep.json index 3ba703a7..451a5455 100644 --- a/languages/ru-RU/economy/rep.json +++ b/languages/ru-RU/economy/rep.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Дать очко репутации пользователю!", - "USAGE": "{{prefix}}rep [@пользователь]", - "EXAMPLES": "{{prefix}}rep @Jonny_Bro#4226", + "USAGE": "rep [@пользователь]", + "EXAMPLES": "rep @Jonny_Bro#4226", "COOLDOWN": "Вы должны подождать **{{time}}** до следующего использования!", "INVALID_USER": "Вы должны упомянуть пользователя!", "BOT_USER": "Боты и так крутые!", diff --git a/languages/ru-RU/economy/rob.json b/languages/ru-RU/economy/rob.json index 1eeee10c..552301c1 100644 --- a/languages/ru-RU/economy/rob.json +++ b/languages/ru-RU/economy/rob.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Попытаться ограбить пользователя!", - "USAGE": "{{prefix}}rob [@пользователь] [сумма]", - "EXAMPLES": "{{prefix}}rob @Jonny_Bro#4226 100", + "USAGE": "rob [@пользователь] [сумма]", + "EXAMPLES": "rob @Jonny_Bro#4226 100", "BOT_USER": "Вы не можете ограбить бота!", "YOURSELF": "Вы не можете ограбить себя!", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", diff --git a/languages/ru-RU/economy/setbio.json b/languages/ru-RU/economy/setbio.json index 4709c085..0d5d688d 100644 --- a/languages/ru-RU/economy/setbio.json +++ b/languages/ru-RU/economy/setbio.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Установить биографию!", - "USAGE": "{{prefix}}setbio [текст]", - "EXAMPLES": "{{prefix}}setbio Меня зовут Жоня, мне 18 и я создатель JaBa :)", + "USAGE": "setbio [текст]", + "EXAMPLES": "setbio Меня зовут Жоня, мне 18 и я создатель JaBa :)", "MISSING": "Укажите биографию!", "MAX_CHARACT": "Ваша биография не должна превышать 100 символов!", "SUCCESS": "Ваша биография изменена!" diff --git a/languages/ru-RU/economy/slots.json b/languages/ru-RU/economy/slots.json index da271062..f8665868 100644 --- a/languages/ru-RU/economy/slots.json +++ b/languages/ru-RU/economy/slots.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Казино \"JaBa Casino\"", - "USAGE": "{{prefix}}slots (сумма)", - "EXAMPLES": "{{prefix}}slots\n{{prefix}}slots 100", + "USAGE": "slots (сумма)", + "EXAMPLES": "slots\nslots 100", "DEFEAT": "**{{username}}** поставил {{money}} и всё проиграл.", "VICTORY": "**{{username}}** поставил {{money}} и выиграл {{won}}!", "NOT_ENOUGH": "У вас нет {{money}}." diff --git a/languages/ru-RU/economy/tictactoe.json b/languages/ru-RU/economy/tictactoe.json index df3b0ae4..a6c37e4b 100644 --- a/languages/ru-RU/economy/tictactoe.json +++ b/languages/ru-RU/economy/tictactoe.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Крестики-нолики!", - "USAGE": "{{prefix}}tictactoe [@пользователь]", - "EXAMPLES": "{{prefix}}tictactoe @Jonny_Bro#4226", + "USAGE": "tictactoe [@пользователь]", + "EXAMPLES": "tictactoe @Jonny_Bro#4226", "NO_USER": "Укажите пользователя!", "BOT_USER": "Вы не можете играть против бота!", "YOURSELF": "Вы не можете играть с самим собой!", diff --git a/languages/ru-RU/economy/transactions.json b/languages/ru-RU/economy/transactions.json index 99bc3073..21fe6678 100644 --- a/languages/ru-RU/economy/transactions.json +++ b/languages/ru-RU/economy/transactions.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Посмотреть историю транзакций!", - "USAGE": "{{prefix}}transactions", - "EXAMPLES": "{{prefix}}transactions", + "USAGE": "transactions", + "EXAMPLES": "transactions", "NO_TRANSACTIONS": "У вас нет транзакций.", "EMBED_TRANSACTIONS": "Ваши транзакции", "BANK": "Банк", diff --git a/languages/ru-RU/economy/withdraw.json b/languages/ru-RU/economy/withdraw.json index 7c90fb92..71e97ccf 100644 --- a/languages/ru-RU/economy/withdraw.json +++ b/languages/ru-RU/economy/withdraw.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Снять кредиты из банка!", - "USAGE": "{{prefix}}withdraw [сумма/all]", - "EXAMPLES": "{{prefix}}withdraw 100\n{{prefix}}withdraw all", + "USAGE": "withdraw [сумма/all]", + "EXAMPLES": "withdraw 100\nwithdraw all", "MISSING_AMOUNT": "Укажите сумму!", "NO_CREDIT": "Недостаточно кредитов на банковском счёте!", "NOT_ENOUGH": "У вас должно быть хотя бы `{{money}}`!", diff --git a/languages/ru-RU/economy/work.json b/languages/ru-RU/economy/work.json index a5513b26..964fd7f8 100644 --- a/languages/ru-RU/economy/work.json +++ b/languages/ru-RU/economy/work.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Получить зарплату!", - "USAGE": "{{prefix}}work", - "EXAMPLES": "{{prefix}}work", + "USAGE": "work", + "EXAMPLES": "work", "COOLDOWN": "Вы должны подождать **{{time}}** до следующей зарплатой!", "AWARD": "Закончите слово AWARD чтобы получить 200 дополнительных кредитов!", "SALARY": "Зарплата", diff --git a/languages/ru-RU/fun/8ball.json b/languages/ru-RU/fun/8ball.json index 53077029..3da81eb7 100644 --- a/languages/ru-RU/fun/8ball.json +++ b/languages/ru-RU/fun/8ball.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Я говорю правду!", - "USAGE": "{{prefix}}8ball [вопрос?]", - "EXAMPLES": "{{prefix}}8ball JaBa крутой?", + "USAGE": "8ball [вопрос?]", + "EXAMPLES": "8ball JaBa крутой?", "ERR_QUESTION": "Введите вопрос!", "RESPONSE_1": "Бесспорно", "RESPONSE_2": "Предрешено", diff --git a/languages/ru-RU/fun/ascii.json b/languages/ru-RU/fun/ascii.json index 8cca6169..1add4ee3 100644 --- a/languages/ru-RU/fun/ascii.json +++ b/languages/ru-RU/fun/ascii.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Превратить текст в ASCII код! Поддерживаются только английские буквы и цифры!", - "USAGE": "{{prefix}}ascii [текст]", - "EXAMPLES": "{{prefix}}ascii Hello world!", + "USAGE": "ascii [текст]", + "EXAMPLES": "ascii Hello world!", "TEXT_MISSING": "Введите текст (не больше 20 символов)!" } \ No newline at end of file diff --git a/languages/ru-RU/fun/choice.json b/languages/ru-RU/fun/choice.json index 2ac58be2..ecdc71d5 100644 --- a/languages/ru-RU/fun/choice.json +++ b/languages/ru-RU/fun/choice.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Я могу помочь вам с выбором!", - "USAGE": "{{prefix}}choice [вариант1/вариант2/вариант3/вариант4...]", - "EXAMPLES": "{{prefix}}choice Вода/Огонь/Ветер", + "USAGE": "choice [вариант1/вариант2/вариант3/вариант4...]", + "EXAMPLES": "choice Вода/Огонь/Ветер", "MISSING": "Укажите больше двух вариантов!\n(либо используйте команду `flip`)", "EMPTY": "Кажется один из вариантов отсутствует... Попробуйте ещё раз!", "PROGRESS": "Думаю...", diff --git a/languages/ru-RU/fun/flip.json b/languages/ru-RU/fun/flip.json index 5013330a..fb837aed 100644 --- a/languages/ru-RU/fun/flip.json +++ b/languages/ru-RU/fun/flip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Подкинуть монетку!", - "USAGE": "{{prefix}}flip", - "EXAMPLES": "{{prefix}}flip", + "USAGE": "flip", + "EXAMPLES": "flip", "HEADS": ":coin: | Орёл!", "TAILS": ":coin: | Решка!" } \ No newline at end of file diff --git a/languages/ru-RU/fun/lmg.json b/languages/ru-RU/fun/lmg.json index fd8ba859..2be474b4 100644 --- a/languages/ru-RU/fun/lmg.json +++ b/languages/ru-RU/fun/lmg.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Создать LMGTFY (давай я загуглю это для тебя) ссылку", - "USAGE": "{{prefix}}lmg [запрос]", - "EXAMPLES": "{{prefix}}lmg Как создать Discord бота?", + "USAGE": "lmg [запрос]", + "EXAMPLES": "lmg Как создать Discord бота?", "MISSING": "Укажите запрос!" } \ No newline at end of file diff --git a/languages/ru-RU/fun/lovecalc.json b/languages/ru-RU/fun/lovecalc.json index 16c429ed..2b3deda6 100644 --- a/languages/ru-RU/fun/lovecalc.json +++ b/languages/ru-RU/fun/lovecalc.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Калькулятор любви", - "USAGE": "{{prefix}}lovecalc [@пользователь1] (@пользователь2)", - "EXAMPLES": "{{prefix}}lovecalc @Jonny_Bro#4226\n{{prefix}}lovecalc @Jonny_Bro#4226 @JaBa#9042", + "USAGE": "lovecalc [@пользователь1] (@пользователь2)", + "EXAMPLES": "lovecalc @Jonny_Bro#4226\nlovecalc @Jonny_Bro#4226 @JaBa#9042", "MISSING": "Вы должны упомянуть одного или двух пользователей!", "CONTENT": "Я думаю, что **{{firstUsername}}** на **{{percent}}%** любит **{{secondUsername}}**!" } \ No newline at end of file diff --git a/languages/ru-RU/fun/memes.json b/languages/ru-RU/fun/memes.json index 0adee526..347ddfbf 100644 --- a/languages/ru-RU/fun/memes.json +++ b/languages/ru-RU/fun/memes.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Получить мем с выбранного или случайного сабреддита", - "USAGE": "{{prefix}}memes (тег)", - "EXAMPLES": "{{prefix}}memes\n{{prefix}}memes me_irl", + "USAGE": "memes (тег)", + "EXAMPLES": "memes\nmemes me_irl", "SEARCHING": "Ищу мем по тегу `{{tag}}`...", "SEARCHING_RANDOM": "Ищу случайный мем...", "EMBED_TITLE": "Доступные категории", diff --git a/languages/ru-RU/general/activity.json b/languages/ru-RU/general/activity.json index 039ccc04..9e2c8b15 100644 --- a/languages/ru-RU/general/activity.json +++ b/languages/ru-RU/general/activity.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Создать активность в голосовом канале!", - "USAGE": "{{prefix}}activity (активность)", - "EXAMPLES": "{{prefix}}activity\n{{prefix}}activity chess", + "USAGE": "activity (активность)", + "EXAMPLES": "activity\nactivity chess", "TITLE": "Список доступных активностей", "FOOTER": "JaBa | Discord Together", "NO_BOOST": "Необходим первый уровень буста или выше!" diff --git a/languages/ru-RU/general/emoji.json b/languages/ru-RU/general/emoji.json index 359b37c8..afcc8716 100644 --- a/languages/ru-RU/general/emoji.json +++ b/languages/ru-RU/general/emoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать информацию об эмодзи!", - "USAGE": "{{prefix}}emoji [эмодзи]", - "EXAMPLES": "{{prefix}}emoji :tada:", + "USAGE": "emoji [эмодзи]", + "EXAMPLES": "emoji :tada:", "TITLE": "Информация об {{emoji}}", "NAME": "Название", "ANIMATED": "Анимирован", diff --git a/languages/ru-RU/general/help.json b/languages/ru-RU/general/help.json index a62ab476..587dfeb0 100644 --- a/languages/ru-RU/general/help.json +++ b/languages/ru-RU/general/help.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать список команд или помощь по данной команде.", - "USAGE": "{{prefix}}help (команда)", - "EXAMPLES": "{{prefix}}help\n{{prefix}}help ping", + "USAGE": "help (команда)", + "EXAMPLES": "help\nhelp ping", "CUSTOM": "У добавленных команд нет описания.", "NOT_FOUND": "Команды `{{search}}` не существует", "FIELD_USAGE": "Использование", @@ -10,7 +10,7 @@ "FIELD_EXAMPLES": "Примеры", "NO_ALIAS": "Нет сокращений", "CMD_TITLE": "Помощь по {{cmd}}", - "INFO": "● Чтобы получить помощь по определённой команде используйте `{{prefix}}help <команда>`!", + "INFO": "● Чтобы получить помощь по определённой команде используйте `help <команда>`!", "CUSTOM_COMMANDS": "Добавленные команды", "FIELD_PERMISSIONS": "Необходимые права", "NO_REQUIRED_PERMISSION": "Никаких особых прав не нужно для использования данной команды.", diff --git a/languages/ru-RU/general/invite.json b/languages/ru-RU/general/invite.json index 28750e97..f5371766 100644 --- a/languages/ru-RU/general/invite.json +++ b/languages/ru-RU/general/invite.json @@ -1,10 +1,10 @@ { "DESCRIPTION": "Получить ссылку на приглашение JaBa!", - "USAGE": "{{prefix}}invite (copy)", - "EXAMPLES": "{{prefix}}invite\n{{prefix}}invite copy", + "USAGE": "invite (copy)", + "EXAMPLES": "invite\ninvite copy", "LINKS": "Ссылки JaBa", "CLICK": "[**Тык**]({{link}})", - "TIP": "Отправьте `{{prefix}}invite copy`, чтобы получить ссылку для копирования!", + "TIP": "Отправьте `invite copy`, чтобы получить ссылку для копирования!", "ADD": "Пригласить JaBa", "VOTE": "Проголосовать за JaBa", "SUPPORT": "Поддержать разработчика" diff --git a/languages/ru-RU/general/invites.json b/languages/ru-RU/general/invites.json index bdfd8ff7..bda3b9a2 100644 --- a/languages/ru-RU/general/invites.json +++ b/languages/ru-RU/general/invites.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать кол-во пользователей которых пользователь пригласил на сервер!", - "USAGE": "{{prefix}}invites (@пользователь)", - "EXAMPLES": "{{prefix}}invites\n{{prefix}}invites @Jonny_Bro#4226", + "USAGE": "invites (@пользователь)", + "EXAMPLES": "invites\ninvites @Jonny_Bro#4226", "NOBODY_AUTHOR": "Вы никого не пригласили на сервер!", "NOBODY_MEMBER": "{{member}} никого не приглашал(а) на сервер!", "CODE": "**{{code}}** ({{uses}} использований) | {{channel}}", diff --git a/languages/ru-RU/general/minecraft.json b/languages/ru-RU/general/minecraft.json index 8fb6425d..30e93152 100644 --- a/languages/ru-RU/general/minecraft.json +++ b/languages/ru-RU/general/minecraft.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать информацию о Minecraft сервере!", - "USAGE": "{{prefix}}minecraft [IP]", - "EXAMPLES": "{{prefix}}minecraft mc.hypixel.net", + "USAGE": "minecraft [IP]", + "EXAMPLES": "minecraft mc.hypixel.net", "MISSING_IP": "Укажите IP сервера!", "FAILED": "Сервер недоступен или доступ запрещён!", "ONLINE": "Онлайн", diff --git a/languages/ru-RU/general/permissions.json b/languages/ru-RU/general/permissions.json index a0234c70..e84eb7c1 100644 --- a/languages/ru-RU/general/permissions.json +++ b/languages/ru-RU/general/permissions.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показать права пользователя", - "USAGE": "{{prefix}}permissions (@пользователь)", - "EXAMPLES": "{{prefix}}permissions\n{{prefix}}permissions @Jonny_Bro#4226", + "USAGE": "permissions (@пользователь)", + "EXAMPLES": "permissions\npermissions @Jonny_Bro#4226", "TITLE": "Права {{user}} в канале {{channel}}" } \ No newline at end of file diff --git a/languages/ru-RU/general/ping.json b/languages/ru-RU/general/ping.json index 9f30f4ee..f785de2d 100644 --- a/languages/ru-RU/general/ping.json +++ b/languages/ru-RU/general/ping.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показать пинг бота", - "USAGE": "{{prefix}}ping", - "EXAMPLES": "{{prefix}}ping", + "USAGE": "ping", + "EXAMPLES": "ping", "CONTENT": "Понг! Мой пинг - **{{ping}}**ms." } \ No newline at end of file diff --git a/languages/ru-RU/general/quote.json b/languages/ru-RU/general/quote.json index 13feca14..96b97d0b 100644 --- a/languages/ru-RU/general/quote.json +++ b/languages/ru-RU/general/quote.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Процитировать сообщение в канал!", - "USAGE": "{{prefix}}quote [ID-сообщения] (канал)", - "EXAMPLES": "{{prefix}}quote 596018101921906698\n{{prefix}}quote 596018101921906698 573508780520898581\n{{prefix}}quote 596018101921906698 #основной", + "USAGE": "quote [ID-сообщения] (канал)", + "EXAMPLES": "quote 596018101921906698\nquote 596018101921906698 573508780520898581\nquote 596018101921906698 #основной", "NO_MESSAGE_ID": "Нет сообщений с данным ID.", "NO_CHANNEL_ID": "Нет канала с данным ID или названием.", "MISSING_ID": "Укажите ID сообщения!" diff --git a/languages/ru-RU/general/remindme.json b/languages/ru-RU/general/remindme.json index 77be3990..5ef41ad6 100644 --- a/languages/ru-RU/general/remindme.json +++ b/languages/ru-RU/general/remindme.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Создать напоминание", - "USAGE": "{{prefix}}remindme [время] [сообщение]", - "EXAMPLES": "{{prefix}}remindme 24h Использовать команду work\n{{prefix}}remindme 3m Достать курицу из морозилки!", + "USAGE": "remindme [время] [сообщение]", + "EXAMPLES": "remindme 24h Использовать команду work\nremindme 3m Достать курицу из морозилки!", "MISSING_MESSAGE": "Введите сообщение!", "SAVED": "Напоминание сохранено!", "TITLE": "Напоминание от JaBa", diff --git a/languages/ru-RU/general/report.json b/languages/ru-RU/general/report.json index d344dbaf..aaf7c6d8 100644 --- a/languages/ru-RU/general/report.json +++ b/languages/ru-RU/general/report.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отправить жалобу в специальный канал!", - "USAGE": "{{prefix}}report [@пользователь] (причина)", - "EXAMPLES": "{{prefix}}report @Jonny_Bro#4226 Нарушение правил", + "USAGE": "report [@пользователь] (причина)", + "EXAMPLES": "report @Jonny_Bro#4226 Нарушение правил", "MISSING_CHANNEL": "Канал для жалоб не настроен!", "MISSING_REASON": "Введите причину!", "MISSING_USER": "Вы должны упомянуть пользователя!", diff --git a/languages/ru-RU/general/serverinfo.json b/languages/ru-RU/general/serverinfo.json index f2cfefdc..b199ce6e 100644 --- a/languages/ru-RU/general/serverinfo.json +++ b/languages/ru-RU/general/serverinfo.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать информацию о сервере!", - "USAGE": "{{prefix}}serverinfo [ID/название]", - "EXAMPLES": "{{prefix}}serverinfo кык\n{{prefix}}serverinfo", + "USAGE": "serverinfo [ID/название]", + "EXAMPLES": "serverinfo кык\nserverinfo", "AFK_CHANNEL": "AFK канал", "NO_AFK_CHANNEL": "Нет AFK канала", "BOOSTS": "Кол-во бустов", diff --git a/languages/ru-RU/general/setafk.json b/languages/ru-RU/general/setafk.json index 5bc4c4fa..9421afc2 100644 --- a/languages/ru-RU/general/setafk.json +++ b/languages/ru-RU/general/setafk.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Установить AFK статус (пользователь который упомянет вас получит сообщение)", - "USAGE": "{{prefix}}setafk [причина/delete]", - "EXAMPLES": "{{prefix}}setafk Сру =)", + "USAGE": "setafk [причина/delete]", + "EXAMPLES": "setafk Сру =)", "MISSING_REASON": "Укажите причину AFK! (не больше 250 символов)", - "SUCCESS": "Теперь вы AFK по причине: **{{reason}}**\nНапишите {{prefix}}afk delete, чтобы принудительно отключить AFK", + "SUCCESS": "Теперь вы AFK по причине: **{{reason}}**\nНапишите afk delete, чтобы принудительно отключить AFK", "DELETED": "**{{username}}**, ваш AFK статус удалён!", "IS_AFK": "**{{user}}** сейчас AFK, причина:\n**`{{reason}}`**" } \ No newline at end of file diff --git a/languages/ru-RU/general/shorturl.json b/languages/ru-RU/general/shorturl.json index 3cd98215..dfb470dd 100644 --- a/languages/ru-RU/general/shorturl.json +++ b/languages/ru-RU/general/shorturl.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Укоротить ссылку!", - "USAGE": "{{prefix}}shorturl [URL]", - "EXAMPLES": "{{prefix}}shorturl https://google.com", + "USAGE": "shorturl [URL]", + "EXAMPLES": "shorturl https://google.com", "MISSING_URL": "Введите ссылку!" } \ No newline at end of file diff --git a/languages/ru-RU/general/staff.json b/languages/ru-RU/general/staff.json index bf89443e..f760640b 100644 --- a/languages/ru-RU/general/staff.json +++ b/languages/ru-RU/general/staff.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать список администрации сервера!", - "USAGE": "{{prefix}}staff", - "EXAMPLES": "{{prefix}}staff", + "USAGE": "staff", + "EXAMPLES": "staff", "TITLE": "Персонал {{guild}}", "ADMINS": "Администраторы", "NO_ADMINS": "Нет администраторов", diff --git a/languages/ru-RU/general/stats.json b/languages/ru-RU/general/stats.json index 085a2307..68c50bb5 100644 --- a/languages/ru-RU/general/stats.json +++ b/languages/ru-RU/general/stats.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать статистику бота!", - "USAGE": "{{prefix}}stats", - "EXAMPLES": "{{prefix}}stats", + "USAGE": "stats", + "EXAMPLES": "stats", "COUNTS_TITLE": "• __Статистика__", "COUNTS_CONTENT": "`Сервера: {{servers}}`\n`Пользователи: {{users}}`", "VERSIONS_TITLE": "• __Использует__", diff --git a/languages/ru-RU/general/suggest.json b/languages/ru-RU/general/suggest.json index 46b23eed..50f73607 100644 --- a/languages/ru-RU/general/suggest.json +++ b/languages/ru-RU/general/suggest.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отправить предложение в специальный канал!", - "USAGE": "{{prefix}}suggest [предложение]", - "EXAMPLES": "{{prefix}}suggest Новый канал #nsfw :smiling_imp:", + "USAGE": "suggest [предложение]", + "EXAMPLES": "suggest Новый канал #nsfw :smiling_imp:", "MISSING_CHANNEL": "Канал для предложений не настроен!", "MISSING_CONTENT": "Введите предложение!", "TITLE": "Предложение - {{user}}", diff --git a/languages/ru-RU/general/translate.json b/languages/ru-RU/general/translate.json index 38e1d06e..02d82c7d 100644 --- a/languages/ru-RU/general/translate.json +++ b/languages/ru-RU/general/translate.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Перевести текст!", - "USAGE": "{{prefix}}translate [язык] [текст]", - "EXAMPLES": "{{prefix}}translate english Как дела?", + "USAGE": "translate [язык] [текст]", + "EXAMPLES": "translate english Как дела?", "LIST_SENT": "Список языков отправлен вам в ЛС!", - "MISSING_LANGUAGE": "Укажите язык! Чтобы получить список языков, введите `{{prefix}}translate langs-list`!", - "INVALID_LANGUAGE": "Язык `{{search}}` не найден! Чтобы получить список языков, введите `{{prefix}}translate langs-list`!", + "MISSING_LANGUAGE": "Укажите язык! Чтобы получить список языков, введите `translate langs-list`!", + "INVALID_LANGUAGE": "Язык `{{search}}` не найден! Чтобы получить список языков, введите `translate langs-list`!", "MISSING_CONTENT": "Введите текст!" } \ No newline at end of file diff --git a/languages/ru-RU/general/userinfo.json b/languages/ru-RU/general/userinfo.json index ef99ba79..018f8bcf 100644 --- a/languages/ru-RU/general/userinfo.json +++ b/languages/ru-RU/general/userinfo.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать информацию о пользователе!", - "USAGE": "{{prefix}}userinfo (@пользователь/ID)", - "EXAMPLES": "{{prefix}}userinfo\n{{prefix}}userinfo @Jonny_Bro#4226\n{{prefix}}userinfo 281361531411890186", + "USAGE": "userinfo (@пользователь/ID)", + "EXAMPLES": "userinfo\nuserinfo @Jonny_Bro#4226\nuserinfo 281361531411890186", "INVALID_USER": "Пользователь с ID `{{search}}` не найден!", "NO_GAME": "Не играет", "NO_ROLE": "Нет роли", diff --git a/languages/ru-RU/general/whois.json b/languages/ru-RU/general/whois.json index 34f96ec5..8c146dee 100644 --- a/languages/ru-RU/general/whois.json +++ b/languages/ru-RU/general/whois.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Получить информацию об IP адресе!", - "USAGE": "{{prefix}}whois (IP)", - "EXAMPLES": "{{prefix}}whois 1.1.1.1", + "USAGE": "whois (IP)", + "EXAMPLES": "whois 1.1.1.1", "NO_IP": "Укажите IP адрес!", "ERROR": "Произошла ошибка при получении данных об {{ip}}", "INFO_ABOUT": "Информация об {{ip}}", diff --git a/languages/ru-RU/images/approved.json b/languages/ru-RU/images/approved.json index d47d893d..438d0cc8 100644 --- a/languages/ru-RU/images/approved.json +++ b/languages/ru-RU/images/approved.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"approved\"", - "USAGE": "{{prefix}}approved (@пользователь)", - "EXAMPLES": "{{prefix}}approved\n{{prefix}}approved @Jonny_Bro#4226" + "USAGE": "approved (@пользователь)", + "EXAMPLES": "approved\napproved @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/avatar.json b/languages/ru-RU/images/avatar.json index fa53acb3..db6a6c0d 100644 --- a/languages/ru-RU/images/avatar.json +++ b/languages/ru-RU/images/avatar.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Возвращает аватар пользователя", - "USAGE": "{{prefix}}avatar (@пользователь) (link)", - "EXAMPLES": "{{prefix}}avatar\n{{prefix}}avatar @Jonny_Bro#4226\n{{prefix}}avatar link" + "USAGE": "avatar (@пользователь) (link)", + "EXAMPLES": "avatar\navatar @Jonny_Bro#4226\navatar link" } \ No newline at end of file diff --git a/languages/ru-RU/images/batslap.json b/languages/ru-RU/images/batslap.json index 478e3a69..14fa22fc 100644 --- a/languages/ru-RU/images/batslap.json +++ b/languages/ru-RU/images/batslap.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"batslap\"", - "USAGE": "{{prefix}}batslap (@пользователь1) (@пользователь2)", - "EXAMPLES": "{{prefix}}batslap\n{{prefix}}batslap @Jonny_Bro#4226 @JaBa#9042" + "USAGE": "batslap (@пользователь1) (@пользователь2)", + "EXAMPLES": "batslap\nbatslap @Jonny_Bro#4226 @JaBa#9042" } \ No newline at end of file diff --git a/languages/ru-RU/images/beautiful.json b/languages/ru-RU/images/beautiful.json index 1882e6e2..0163009a 100644 --- a/languages/ru-RU/images/beautiful.json +++ b/languages/ru-RU/images/beautiful.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"beautiful\"", - "USAGE": "{{prefix}}beautiful (@пользователь)", - "EXAMPLES": "{{prefix}}beautiful\n{{prefix}}beautiful @Jonny_Bro#4226" + "USAGE": "beautiful (@пользователь)", + "EXAMPLES": "beautiful\nbeautiful @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/bed.json b/languages/ru-RU/images/bed.json index 4259e052..429f76a3 100644 --- a/languages/ru-RU/images/bed.json +++ b/languages/ru-RU/images/bed.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"bed\"", - "USAGE": "{{prefix}}bed (@пользователь1) (@пользователь2)", - "EXAMPLES": "{{prefix}}bed @Jonny_Bro#4226\n{{prefix}}bed @Jonny_Bro#4226 @Dkflbvbh k.hyfqc#9402" + "USAGE": "bed (@пользователь1) (@пользователь2)", + "EXAMPLES": "bed @Jonny_Bro#4226\nbed @Jonny_Bro#4226 @Dkflbvbh k.hyfqc#9402" } \ No newline at end of file diff --git a/languages/ru-RU/images/brazzers.json b/languages/ru-RU/images/brazzers.json index 745b3e64..8fb55cc8 100644 --- a/languages/ru-RU/images/brazzers.json +++ b/languages/ru-RU/images/brazzers.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"brazzers\"", - "USAGE": "{{prefix}}brazzers (@пользователь)", - "EXAMPLES": "{{prefix}}brazzers\n{{prefix}}brazzers @Jonny_Bro#4226" + "USAGE": "brazzers (@пользователь)", + "EXAMPLES": "brazzers\nbrazzers @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/burn.json b/languages/ru-RU/images/burn.json index 3f80ed9a..334b736c 100644 --- a/languages/ru-RU/images/burn.json +++ b/languages/ru-RU/images/burn.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"burn\"", - "USAGE": "{{prefix}}burn (@пользователь)", - "EXAMPLES": "{{prefix}}burn\n{{prefix}}burn @Jonny_Bro#4226" + "USAGE": "burn (@пользователь)", + "EXAMPLES": "burn\nburn @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/captcha.json b/languages/ru-RU/images/captcha.json index 97b6f3ce..e783f20e 100644 --- a/languages/ru-RU/images/captcha.json +++ b/languages/ru-RU/images/captcha.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"captcha\"", - "USAGE": "{{prefix}}captcha (@пользователь)", - "EXAMPLES": "{{prefix}}captcha\n{{prefix}}captcha @Jonny_Bro#4226" + "USAGE": "captcha (@пользователь)", + "EXAMPLES": "captcha\ncaptcha @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/challenger.json b/languages/ru-RU/images/challenger.json index 2c44123c..c2840534 100644 --- a/languages/ru-RU/images/challenger.json +++ b/languages/ru-RU/images/challenger.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"challenger\"", - "USAGE": "{{prefix}}challenger (@пользователь)", - "EXAMPLES": "{{prefix}}challenger\n{{prefix}}challenger @Jonny_Bro#4226" + "USAGE": "challenger (@пользователь)", + "EXAMPLES": "challenger\nchallenger @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/clyde.json b/languages/ru-RU/images/clyde.json index c0f68759..d1cf8bb8 100644 --- a/languages/ru-RU/images/clyde.json +++ b/languages/ru-RU/images/clyde.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Создать изображение \"Clyde\"", - "USAGE": "{{prefix}}clyde [текст]", - "EXAMPLES": "{{prefix}}clyde Discord закроется 11 декабря 2002 года. Прощайте!.", + "USAGE": "clyde [текст]", + "EXAMPLES": "clyde Discord закроется 11 декабря 2002 года. Прощайте!.", "MISSING_TEXT": "Введите текст!" } \ No newline at end of file diff --git a/languages/ru-RU/images/crush.json b/languages/ru-RU/images/crush.json index 8acac070..dd4cdf64 100644 --- a/languages/ru-RU/images/crush.json +++ b/languages/ru-RU/images/crush.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"crush\"", - "USAGE": "{{prefix}}crush (@пользователь)", - "EXAMPLES": "{{prefix}}crush\n{{prefix}}crush @Jonny_Bro#4226" + "USAGE": "crush (@пользователь)", + "EXAMPLES": "crush\ncrush @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/dictator.json b/languages/ru-RU/images/dictator.json index ebb904af..6e8d5183 100644 --- a/languages/ru-RU/images/dictator.json +++ b/languages/ru-RU/images/dictator.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"dictator\"", - "USAGE": "{{prefix}}dictator (@пользователь)", - "EXAMPLES": "{{prefix}}dictator\n{{prefix}}dictator @Jonny_Bro#4226" + "USAGE": "dictator (@пользователь)", + "EXAMPLES": "dictator\ndictator @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/facepalm.json b/languages/ru-RU/images/facepalm.json index 5b68a996..cbb35931 100644 --- a/languages/ru-RU/images/facepalm.json +++ b/languages/ru-RU/images/facepalm.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"facepalm\"", - "USAGE": "{{prefix}}facepalm (@пользователь)", - "EXAMPLES": "{{prefix}}facepalm\n{{prefix}}facepalm @Jonny_Bro#4226" + "USAGE": "facepalm (@пользователь)", + "EXAMPLES": "facepalm\nfacepalm @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/fire.json b/languages/ru-RU/images/fire.json index d5b06706..323ace8b 100644 --- a/languages/ru-RU/images/fire.json +++ b/languages/ru-RU/images/fire.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"fire\"", - "USAGE": "{{prefix}}fire (@пользователь)", - "EXAMPLES": "{{prefix}}fire\n{{prefix}}fire @Jonny_Bro#4226" + "USAGE": "fire (@пользователь)", + "EXAMPLES": "fire\nfire @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/jail.json b/languages/ru-RU/images/jail.json index 9c41ef4e..9df09c50 100644 --- a/languages/ru-RU/images/jail.json +++ b/languages/ru-RU/images/jail.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"jail\"", - "USAGE": "{{prefix}}jail (@пользователь)", - "EXAMPLES": "{{prefix}}jail\n{{prefix}}jail @Jonny_Bro#4226" + "USAGE": "jail (@пользователь)", + "EXAMPLES": "jail\njail @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/love.json b/languages/ru-RU/images/love.json index 310dbaba..393acee1 100644 --- a/languages/ru-RU/images/love.json +++ b/languages/ru-RU/images/love.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"love\"", - "USAGE": "{{prefix}}love (@пользователь1) (@пользователь2)", - "EXAMPLES": "{{prefix}}love @Jonny_Bro#4226\n{{prefix}}love @Jonny_Bro#4226 @JaBa#9042" + "USAGE": "love (@пользователь1) (@пользователь2)", + "EXAMPLES": "love @Jonny_Bro#4226\nlove @Jonny_Bro#4226 @JaBa#9042" } \ No newline at end of file diff --git a/languages/ru-RU/images/magik.json b/languages/ru-RU/images/magik.json index ddb5c01b..efcaec27 100644 --- a/languages/ru-RU/images/magik.json +++ b/languages/ru-RU/images/magik.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"magik\"", - "USAGE": "{{prefix}}magik (@пользователь)", - "EXAMPLES": "{{prefix}}magik\n{{prefix}}magik @Jonny_Bro#4226" + "USAGE": "magik (@пользователь)", + "EXAMPLES": "magik\nmagik @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/mission.json b/languages/ru-RU/images/mission.json index 2bbef711..76c18616 100644 --- a/languages/ru-RU/images/mission.json +++ b/languages/ru-RU/images/mission.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"mission\"", - "USAGE": "{{prefix}}mission (@пользователь)", - "EXAMPLES": "{{prefix}}mission\n{{prefix}}mission @Jonny_Bro#4226" + "USAGE": "mission (@пользователь)", + "EXAMPLES": "mission\nmission @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/phcomment.json b/languages/ru-RU/images/phcomment.json index 8f8f4db8..f19ab323 100644 --- a/languages/ru-RU/images/phcomment.json +++ b/languages/ru-RU/images/phcomment.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Создать изображение \"phcomment\"", - "USAGE": "{{prefix}}phcomment (@пользователь) [текст]", - "EXAMPLES": "{{prefix}}phcomment Привет!\n{{prefix}}phcomment @Jonny_Bro#4226 Привет!", + "USAGE": "phcomment (@пользователь) [текст]", + "EXAMPLES": "phcomment Привет!\nphcomment @Jonny_Bro#4226 Привет!", "MISSING_TEXT": "Укажите текст!" } \ No newline at end of file diff --git a/languages/ru-RU/images/ps4.json b/languages/ru-RU/images/ps4.json index 075d1fe9..bfd52420 100644 --- a/languages/ru-RU/images/ps4.json +++ b/languages/ru-RU/images/ps4.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"ps4\"", - "USAGE": "{{prefix}}ps4 (@пользователь)", - "EXAMPLES": "{{prefix}}ps4\n{{prefix}}ps4 @Jonny_Bro#4226" + "USAGE": "ps4 (@пользователь)", + "EXAMPLES": "ps4\nps4 @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/qrcode.json b/languages/ru-RU/images/qrcode.json index fe8be0d0..842082af 100644 --- a/languages/ru-RU/images/qrcode.json +++ b/languages/ru-RU/images/qrcode.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Создать QR код из текста", - "USAGE": "{{prefix}}qrcode [текст]", - "EXAMPLES": "{{prefix}}qrcode Hello World!", + "USAGE": "qrcode [текст]", + "EXAMPLES": "qrcode Hello World!", "MISSING_TEXT": "Укажите текст!", "SUCCESS": "Вот ваш QR код!" } \ No newline at end of file diff --git a/languages/ru-RU/images/rip.json b/languages/ru-RU/images/rip.json index 52412564..b0a3b421 100644 --- a/languages/ru-RU/images/rip.json +++ b/languages/ru-RU/images/rip.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"rip\"", - "USAGE": "{{prefix}}rip (@пользователь)", - "EXAMPLES": "{{prefix}}rip\n{{prefix}}rip @Jonny_Bro#4226" + "USAGE": "rip (@пользователь)", + "EXAMPLES": "rip\nrip @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/scary.json b/languages/ru-RU/images/scary.json index 5522b4ef..8e608a16 100644 --- a/languages/ru-RU/images/scary.json +++ b/languages/ru-RU/images/scary.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"scary\"", - "USAGE": "{{prefix}}scary (@пользователь)", - "EXAMPLES": "{{prefix}}scary\n{{prefix}}scary @Jonny_Bro#4226" + "USAGE": "scary (@пользователь)", + "EXAMPLES": "scary\nscary @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/steamcard.json b/languages/ru-RU/images/steamcard.json index d93ef85f..93a564ba 100644 --- a/languages/ru-RU/images/steamcard.json +++ b/languages/ru-RU/images/steamcard.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"steamcard\"", - "USAGE": "{{prefix}}steamcard [текст] (@пользователь)", - "EXAMPLES": "{{prefix}}steamcard Коллекционная карточка\n{{prefix}}steamcard Карточка @Jonny_Bro#4226" + "USAGE": "steamcard [текст] (@пользователь)", + "EXAMPLES": "steamcard Коллекционная карточка\nsteamcard Карточка @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/tobecontinued.json b/languages/ru-RU/images/tobecontinued.json index eb5fa576..2bf5d1b9 100644 --- a/languages/ru-RU/images/tobecontinued.json +++ b/languages/ru-RU/images/tobecontinued.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"tobecontinued\"", - "USAGE": "{{prefix}}tobecontinued (@пользователь)", - "EXAMPLES": "{{prefix}}tobecontinued\n{{prefix}}tobecontinued @Jonny_Bro#4226" + "USAGE": "tobecontinued (@пользователь)", + "EXAMPLES": "tobecontinued\ntobecontinued @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/trash.json b/languages/ru-RU/images/trash.json index ae4846e9..6e3bca23 100644 --- a/languages/ru-RU/images/trash.json +++ b/languages/ru-RU/images/trash.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"trash\"", - "USAGE": "{{prefix}}trash (@пользователь)", - "EXAMPLES": "{{prefix}}trash\n{{prefix}}trash @Jonny_Bro#4226" + "USAGE": "trash (@пользователь)", + "EXAMPLES": "trash\ntrash @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/triggered.json b/languages/ru-RU/images/triggered.json index 18d4fd48..7030e4b3 100644 --- a/languages/ru-RU/images/triggered.json +++ b/languages/ru-RU/images/triggered.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"triggered\"", - "USAGE": "{{prefix}}triggered (@пользователь)", - "EXAMPLES": "{{prefix}}triggered\n{{prefix}}triggered @Jonny_Bro#4226" + "USAGE": "triggered (@пользователь)", + "EXAMPLES": "triggered\ntriggered @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/wanted.json b/languages/ru-RU/images/wanted.json index 7bd86ffb..60bcb6d0 100644 --- a/languages/ru-RU/images/wanted.json +++ b/languages/ru-RU/images/wanted.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"wanted\"", - "USAGE": "{{prefix}}wanted (@пользователь)", - "EXAMPLES": "{{prefix}}wanted\n{{prefix}}wanted @Jonny_Bro#4226" + "USAGE": "wanted (@пользователь)", + "EXAMPLES": "wanted\nwanted @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/wasted.json b/languages/ru-RU/images/wasted.json index b035f42b..f38a3710 100644 --- a/languages/ru-RU/images/wasted.json +++ b/languages/ru-RU/images/wasted.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"wasted\"", - "USAGE": "{{prefix}}wasted (@пользователь)", - "EXAMPLES": "{{prefix}}wasted\n{{prefix}}wasted @Jonny_Bro#4226" + "USAGE": "wasted (@пользователь)", + "EXAMPLES": "wasted\nwasted @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/ru-RU/images/youtube-comment.json b/languages/ru-RU/images/youtube-comment.json index 93dd69c7..e9f17ff7 100644 --- a/languages/ru-RU/images/youtube-comment.json +++ b/languages/ru-RU/images/youtube-comment.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Создать изображение \"ytcomment\"", - "USAGE": "{{prefix}}ytcomment (@пользователь) [текст]", - "EXAMPLES": "{{prefix}}ytomment Привет!\n{{prefix}}ytcomment @Jonny_Bro#4226 Привет!" + "USAGE": "ytcomment (@пользователь) [текст]", + "EXAMPLES": "ytomment Привет!\nytcomment @Jonny_Bro#4226 Привет!" } \ No newline at end of file diff --git a/languages/ru-RU/moderation/announcement.json b/languages/ru-RU/moderation/announcement.json index 8d339711..01275cc7 100644 --- a/languages/ru-RU/moderation/announcement.json +++ b/languages/ru-RU/moderation/announcement.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отправить объявление в текущий канал!", - "USAGE": "{{prefix}}announcement [текст]", - "EXAMPLES": "{{prefix}}announcement Новый модератор!", + "USAGE": "announcement [текст]", + "EXAMPLES": "announcement Новый модератор!", "MISSING_TEXT": "Укажите текст!", "TOO_LONG": "Текст должен быть короче 1030 символов!", "MENTION_PROMPT": "Хотите добавить упоминание к вашему сообщению?\nОтправьте `да` или `нет`!", diff --git a/languages/ru-RU/moderation/ban.json b/languages/ru-RU/moderation/ban.json index 1def06de..b99fc6f9 100644 --- a/languages/ru-RU/moderation/ban.json +++ b/languages/ru-RU/moderation/ban.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Забанить пользователя на сервере!", - "USAGE": "{{prefix}}ban [@пользователь] (причина)", - "EXAMPLES": "{{prefix}}ban @Jonny_Bro#4226 Спам", + "USAGE": "ban [@пользователь] (причина)", + "EXAMPLES": "ban @Jonny_Bro#4226 Спам", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "YOURSELF": "Вы не можете забанить себя!", "SUPERIOR": "Вы не можете сделать это, т.к. пользователь стоит выше вас по роли!", diff --git a/languages/ru-RU/moderation/clear.json b/languages/ru-RU/moderation/clear.json index e04c9275..6ce6a0e6 100644 --- a/languages/ru-RU/moderation/clear.json +++ b/languages/ru-RU/moderation/clear.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Удалить сообщения!", - "USAGE": "{{prefix}}clear [кол-во_сообщений] (@пользователь)", - "EXAMPLES": "{{prefix}}clear 10\n{{prefix}}clear 10 @Jonny_Bro#4226\n{{prefix}}clear all", + "USAGE": "clear [кол-во_сообщений] (@пользователь)", + "EXAMPLES": "clear 10\nclear 10 @Jonny_Bro#4226\nclear all", "MISSING_AMOUNT": "Укажите кол-во сообщений для удаления!", "ALL_CONFIRM": "Все сообщения в канале будут удалены! Введите `confirm` для подтверждения", "CHANNEL_CLEARED": "Канал очищен!", diff --git a/languages/ru-RU/moderation/clearwarns.json b/languages/ru-RU/moderation/clearwarns.json index 22cd6777..c5bc83e3 100644 --- a/languages/ru-RU/moderation/clearwarns.json +++ b/languages/ru-RU/moderation/clearwarns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Снять все предупреждения с пользователя!", - "USAGE": "{{prefix}}clearwarns [@пользователь]", - "EXAMPLES": "{{prefix}}clearwarns @Jonny_Bro#4226", + "USAGE": "clearwarns [@пользователь]", + "EXAMPLES": "clearwarns @Jonny_Bro#4226", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "SUCCESS": "Предупреждения пользователя **{{username}}** удалены!" } \ No newline at end of file diff --git a/languages/ru-RU/moderation/giveaway.json b/languages/ru-RU/moderation/giveaway.json index 51163e20..41d27ccf 100644 --- a/languages/ru-RU/moderation/giveaway.json +++ b/languages/ru-RU/moderation/giveaway.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Управление раздачами!", - "USAGE": "{{prefix}}giveaway [create/reroll/delete/end] [время] [кол-во победителей] (Дроп? true) [приз]", - "EXAMPLES": "{{prefix}}giveaway create 1d 2 100 рублей на карту!\n{{prefix}}giveaway create 1d 2 true 100 рублей на карту\n{{prefix}}giveaway reroll 597812898022031374", + "USAGE": "giveaway [create/reroll/delete/end] [время] [кол-во победителей] (Дроп? true) [приз]", + "EXAMPLES": "giveaway create 1d 2 100 рублей на карту!\ngiveaway create 1d 2 true 100 рублей на карту\ngiveaway reroll 597812898022031374", "MISSING_STATUS": "Выберите действие: `create`, `reroll`, `end` или `delete`!", "INVALID_CREATE": "Какой-то из аргументов указан неверно, попробуйте снова!", "MISSING_ID": "Укажите ID сообщения раздачи!", diff --git a/languages/ru-RU/moderation/kick.json b/languages/ru-RU/moderation/kick.json index 7dfda59c..9c0b9769 100644 --- a/languages/ru-RU/moderation/kick.json +++ b/languages/ru-RU/moderation/kick.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Кикнуть пользователя!", - "USAGE": "{{prefix}}kick [@пользователь] (причина)", - "EXAMPLES": "{{prefix}}kick @Jonny_Bro#4226 Спам", + "USAGE": "kick [@пользователь] (причина)", + "EXAMPLES": "kick @Jonny_Bro#4226 Спам", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "YOURSELF": "Вы не можете кикнуть себя!", "MISSING_PERM": "Произошла ошибка... Проверьте, есть ли у вас право кикать пользователей и попробуйте снова!", diff --git a/languages/ru-RU/moderation/mute.json b/languages/ru-RU/moderation/mute.json index b0087579..4b9e55a7 100644 --- a/languages/ru-RU/moderation/mute.json +++ b/languages/ru-RU/moderation/mute.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Запретить пользователю писать сообщения и заходить в голосовые каналы!", - "USAGE": "{{prefix}}mute [@пользователь] [время] (причина)", - "EXAMPLES": "{{prefix}}mute @Jonny_Bro#4226 24h Спам", + "USAGE": "mute [@пользователь] [время] (причина)", + "EXAMPLES": "mute @Jonny_Bro#4226 24h Спам", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "YOURSELF": "Вы не можете замутить себя!", "MUTED_DM": "Привет {{username}},\nвы были замучены на сервере **{{server}}** пользователем **{{moderator}}** на **{{time}}** по причине **{{reason}}**!", diff --git a/languages/ru-RU/moderation/poll.json b/languages/ru-RU/moderation/poll.json index b02319d1..01002758 100644 --- a/languages/ru-RU/moderation/poll.json +++ b/languages/ru-RU/moderation/poll.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Запустить опрос в текущем канале!", - "USAGE": "{{prefix}}poll [вопрос]", - "EXAMPLES": "{{prefix}}poll Земля плоская?", + "USAGE": "poll [вопрос]", + "EXAMPLES": "poll Земля плоская?", "MISSING_QUESTION": "Введите вопрос!", "REACT": "Отреагируйте {{success}} или {{error}}!", "TITLE": "📊 Опрос:" diff --git a/languages/ru-RU/moderation/setwarns.json b/languages/ru-RU/moderation/setwarns.json index f5dcc14b..0b8a00cd 100644 --- a/languages/ru-RU/moderation/setwarns.json +++ b/languages/ru-RU/moderation/setwarns.json @@ -1,12 +1,12 @@ { "DESCRIPTION": "Настроить наказание которое пользователь будет получать после данного кол-ва предупреждений!", - "USAGE": "{{prefix}}setwarns [kick/ban] [число/reset]", - "EXAMPLES": "{{prefix}}setwarns kick 5\n{{prefix}}setwarns ban 10\n{{prefix}}setwarns ban reset", + "USAGE": "setwarns [kick/ban] [число/reset]", + "EXAMPLES": "setwarns kick 5\nsetwarns ban 10\nsetwarns ban reset", "MISSING_TYPE": "Выберите действие: `kick` или `ban`!", - "SUCCESS_KICK": "`{{count}}` приведут к кику!\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*", - "SUCCESS_BAN": "`{{count}}` приведут к бану!\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*", - "SUCCESS_KICK_RESET": "**Автокик пользователей отключён!**\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*", - "SUCCESS_BAN_RESET": "**Автобан пользователей отключён!**\n\n:arrow_right_hook: *Используйте `{{prefix}}configuration`, чтобы увидеть обновлённые настройки!*", + "SUCCESS_KICK": "`{{count}}` приведут к кику!\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", + "SUCCESS_BAN": "`{{count}}` приведут к бану!\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", + "SUCCESS_KICK_RESET": "**Автокик пользователей отключён!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", + "SUCCESS_BAN_RESET": "**Автобан пользователей отключён!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", "AUTO_BAN": "**{{username}}** был автоматически забанен за достижение {{count}}!", "AUTO_KICK": "**{{username}}** был автоматически кикнут за достижение {{count}}!" } \ No newline at end of file diff --git a/languages/ru-RU/moderation/unban.json b/languages/ru-RU/moderation/unban.json index 0194012e..4466a188 100644 --- a/languages/ru-RU/moderation/unban.json +++ b/languages/ru-RU/moderation/unban.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Разбанить пользователя на сервере!", - "USAGE": "{{prefix}}unban [ID]", - "EXAMPLES": "{{prefix}}unban 281361531411890186", + "USAGE": "unban [ID]", + "EXAMPLES": "unban 281361531411890186", "MISSING_ID": "Укажите ID пользователя!", "NOT_BANNED": "**{{username}}** не забанен!", "UNBANNED": "**{{username}}** был разбанен на сервере **{{server}}**!" diff --git a/languages/ru-RU/moderation/unmute.json b/languages/ru-RU/moderation/unmute.json index 7f4734e7..9c7a2477 100644 --- a/languages/ru-RU/moderation/unmute.json +++ b/languages/ru-RU/moderation/unmute.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Размутить пользователя!", - "USAGE": "{{prefix}}unmute [@пользователь]", - "EXAMPLES": "{{prefix}}unmute @Jonny_Bro#4226", + "USAGE": "unmute [@пользователь]", + "EXAMPLES": "unmute @Jonny_Bro#4226", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "NOT_MUTED": "**{{username}}** не замучен на данном сервере!", "SUCCESS": "**{{username}}** был размучен на данном сервере!", diff --git a/languages/ru-RU/moderation/warn.json b/languages/ru-RU/moderation/warn.json index 75ebc123..87bc0e04 100644 --- a/languages/ru-RU/moderation/warn.json +++ b/languages/ru-RU/moderation/warn.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Выдать предупреждение пользователю в ЛС", - "USAGE": "{{prefix}}warn [@пользователь] (причина)", - "EXAMPLES": "{{prefix}}warn @Jonny_Bro#4226 stupid", + "USAGE": "warn [@пользователь] (причина)", + "EXAMPLES": "warn @Jonny_Bro#4226 stupid", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "YOURSELF": "Вы не можете подать жалобу на себя!", "MISSING_REASON": "Укажите причину!", diff --git a/languages/ru-RU/moderation/warns.json b/languages/ru-RU/moderation/warns.json index b01cb6d5..91d0e5e9 100644 --- a/languages/ru-RU/moderation/warns.json +++ b/languages/ru-RU/moderation/warns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать список нарушений пользователя!", - "USAGE": "{{prefix}}sanctions [@пользователь]", - "EXAMPLES": "{{prefix}}sanctions @Jonny_Bro#4226", + "USAGE": "sanctions [@пользователь]", + "EXAMPLES": "sanctions @Jonny_Bro#4226", "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "NO_SANCTION": "У **{{username}}** нет нарушений." } \ No newline at end of file diff --git a/languages/ru-RU/music/autoplay.json b/languages/ru-RU/music/autoplay.json index 1fb9cfeb..110409f4 100644 --- a/languages/ru-RU/music/autoplay.json +++ b/languages/ru-RU/music/autoplay.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Включить или отключить автовоспроизведение", - "USAGE": "{{prefix}}autoplay", - "EXAMPLES": "{{prefix}}autoplay", + "USAGE": "autoplay", + "EXAMPLES": "autoplay", "SUCCESS_ENABLED": "Автовоспроизведение включено!", "SUCCESS_DISABLED": "Автовоспроизведение выключено!" } \ No newline at end of file diff --git a/languages/ru-RU/music/back.json b/languages/ru-RU/music/back.json index 37a77dc1..1851b7b5 100644 --- a/languages/ru-RU/music/back.json +++ b/languages/ru-RU/music/back.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Включить предыдущий трек", - "USAGE": "{{prefix}}back", - "EXAMPLES": "{{prefix}}back", + "USAGE": "back", + "EXAMPLES": "back", "NO_PREV_SONG": "Предыдущий трек отсутствует!", "SUCCESS": "Играет предыдущий трек!" } \ No newline at end of file diff --git a/languages/ru-RU/music/clip.json b/languages/ru-RU/music/clip.json index bb239237..40894388 100644 --- a/languages/ru-RU/music/clip.json +++ b/languages/ru-RU/music/clip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Воспроизвести клип", - "USAGE": "{{prefix}}clip [название-файла]", - "EXAMPLES": "{{prefix}}clip haha", + "USAGE": "clip [название-файла]", + "EXAMPLES": "clip haha", "NO_ARG": "Укажите название файла!", "NO_FILE": "Файл {{file}} отсутствует!", "ACTIVE_QUEUE": "Не могу воспроизвести клип, т.к. на сервере есть активная очередь!", diff --git a/languages/ru-RU/music/clips.json b/languages/ru-RU/music/clips.json index 55b804cf..04d8b9e8 100644 --- a/languages/ru-RU/music/clips.json +++ b/languages/ru-RU/music/clips.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показать список доступных звуков", - "USAGE": "{{prefix}}clips", - "EXAMPLES": "{{prefix}}clips", + "USAGE": "clips", + "EXAMPLES": "clips", "EMBED_TITLE": "**Список клипов**" } \ No newline at end of file diff --git a/languages/ru-RU/music/filter.json b/languages/ru-RU/music/filter.json index 4501e882..9ce906ee 100644 --- a/languages/ru-RU/music/filter.json +++ b/languages/ru-RU/music/filter.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Включить или отключить фильтр музыки", - "USAGE": "{{prefix}}filter [фильтр]", - "EXAMPLES": "{{prefix}}filter vaporwave", - "MISSING_FILTER": "Укажите фильтр для его включения! (или отправьте `{{prefix}}filters`, чтобы увидеть статусы фильтров)", - "UNKNOWN_FILTER": "Заданный фильтр не существует! Используйте `{{prefix}}filters` чтобы увидеть список фильтров или `{{prefix}}filter off` чтобы отключить все фильтры!", + "USAGE": "filter [фильтр]", + "EXAMPLES": "filter vaporwave", + "MISSING_FILTER": "Укажите фильтр для его включения! (или отправьте `filters`, чтобы увидеть статусы фильтров)", + "UNKNOWN_FILTER": "Заданный фильтр не существует! Используйте `filters` чтобы увидеть список фильтров или `filter off` чтобы отключить все фильтры!", "CHANGING_FILTER": "Обновляю фильтры, подождите...", "REMOVING_FILTER": "Отключаю все фильтры, подождите..." } \ No newline at end of file diff --git a/languages/ru-RU/music/filters.json b/languages/ru-RU/music/filters.json index a1c0a5a4..8f5f9bc3 100644 --- a/languages/ru-RU/music/filters.json +++ b/languages/ru-RU/music/filters.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Получить список фильтров и их статусы", - "USAGE": "{{prefix}}filters", - "EXAMPLES": "{{prefix}}filters", + "USAGE": "filters", + "EXAMPLES": "filters", "TITLE": "**Фильтры**", - "CONTENT": "Вот список всех имеющихся фильтров.\nИспользуйте `{{prefix}}filter <фильтр>`, чтобы изменить статус одного из них." + "CONTENT": "Вот список всех имеющихся фильтров.\nИспользуйте `filter <фильтр>`, чтобы изменить статус одного из них." } \ No newline at end of file diff --git a/languages/ru-RU/music/jump.json b/languages/ru-RU/music/jump.json index 18ecc043..767c0982 100644 --- a/languages/ru-RU/music/jump.json +++ b/languages/ru-RU/music/jump.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Перейти на заданный трек", - "USAGE": "{{prefix}}jump [номер]", - "EXAMPLES": "{{prefix}}jump 3", - "NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `{{prefix}}back`!", + "USAGE": "jump [номер]", + "EXAMPLES": "jump 3", + "NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `back`!", "SUCCESS": "Играет выбранный трек!" } \ No newline at end of file diff --git a/languages/ru-RU/music/loop.json b/languages/ru-RU/music/loop.json index c8092713..ea337ea9 100644 --- a/languages/ru-RU/music/loop.json +++ b/languages/ru-RU/music/loop.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Включить или отключить повтор очереди/одного трека!", - "USAGE": "{{prefix}}loop (queue/all/song/single)", - "EXAMPLES": "{{prefix}}loop queue\n{{prefix}}loop single", + "USAGE": "loop (queue/all/song/single)", + "EXAMPLES": "loop queue\nloop single", "QUEUE": "Повтор очереди **включён**!", "SONG": "Повтор текущего трека **включён**!", "DISABLED": "Повтор **отключён**!" diff --git a/languages/ru-RU/music/lyrics.json b/languages/ru-RU/music/lyrics.json index c9aec822..98622a3f 100644 --- a/languages/ru-RU/music/lyrics.json +++ b/languages/ru-RU/music/lyrics.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Найти текст песни", - "USAGE": "{{prefix}}lyrics [название-песни]", - "EXAMPLES": "{{prefix}}lyrics Skyfall", + "USAGE": "lyrics [название-песни]", + "EXAMPLES": "lyrics Skyfall", "LYRICS_OF": "🎤 Текст {{songName}}", "AND_MORE": "\n**и т.д...**", "CLICK_HERE": "Нажмите сюда, чтобы открыть ссылку на слова к этой песне", diff --git a/languages/ru-RU/music/np.json b/languages/ru-RU/music/np.json index f80a02b0..92e22c4c 100644 --- a/languages/ru-RU/music/np.json +++ b/languages/ru-RU/music/np.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать информацию о играющем сейчас треке!", - "USAGE": "{{prefix}}np", - "EXAMPLES": "{{prefix}}np", + "USAGE": "np", + "EXAMPLES": "np", "CURRENTLY_PLAYING": "Сейчас играет", "T_TITLE": "Название", "T_CHANNEL": "Канал", diff --git a/languages/ru-RU/music/pause.json b/languages/ru-RU/music/pause.json index 5dd811cb..808898e0 100644 --- a/languages/ru-RU/music/pause.json +++ b/languages/ru-RU/music/pause.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Поставить воспроизведение очереди на паузу!", - "USAGE": "{{prefix}}pause", - "EXAMPLES": "{{prefix}}pause", + "USAGE": "pause", + "EXAMPLES": "pause", "SUCCESS": "⏸️ Воспроизведение очереди приостановлено." } \ No newline at end of file diff --git a/languages/ru-RU/music/play.json b/languages/ru-RU/music/play.json index 88471614..3ffc330a 100644 --- a/languages/ru-RU/music/play.json +++ b/languages/ru-RU/music/play.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Начать воспроизведение трека!", - "USAGE": "{{prefix}}play [название-трека/ссылка]", - "EXAMPLES": "{{prefix}}play Never Gonna Give You Up", + "USAGE": "play [название-трека/ссылка]", + "EXAMPLES": "play Never Gonna Give You Up", "NO_VOICE_CHANNEL": "Вы должны находиться в голосовом канале!", "VOICE_CHANNEL_CONNECT": "Я не могу присоедениться к вашему голосовому каналу!", "MISSING_SONG_NAME": "Укажите название трека или ссылку на него!", diff --git a/languages/ru-RU/music/queue.json b/languages/ru-RU/music/queue.json index 7b4ef50b..60e18481 100644 --- a/languages/ru-RU/music/queue.json +++ b/languages/ru-RU/music/queue.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать очередь на воспроизведение", - "USAGE": "{{prefix}}queue", - "EXAMPLES": "{{prefix}}queue", + "USAGE": "queue", + "EXAMPLES": "queue", "TITLE": "Очередь", "ADDED": "Добавил" } \ No newline at end of file diff --git a/languages/ru-RU/music/resume.json b/languages/ru-RU/music/resume.json index 7d7f7113..02c1e29e 100644 --- a/languages/ru-RU/music/resume.json +++ b/languages/ru-RU/music/resume.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Продолжает воспроизведение очереди!", - "USAGE": "{{prefix}}resume", - "EXAMPLES": "{{prefix}}resume", + "USAGE": "resume", + "EXAMPLES": "resume", "SUCCESS": "▶️ Воспроизведение очереди продолжается!" } \ No newline at end of file diff --git a/languages/ru-RU/music/seek.json b/languages/ru-RU/music/seek.json index 80a1282f..0a7c416f 100644 --- a/languages/ru-RU/music/seek.json +++ b/languages/ru-RU/music/seek.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Перемотать вперед или назад на данное время в текущем треке!", - "USAGE": "{{prefix}}seek [время]", - "EXAMPLES": "{{prefix}}seek 10s\n{{prefix}}seek -10s", + "USAGE": "seek [время]", + "EXAMPLES": "seek 10s\nseek -10s", "INVALID_TIME": "Укажите время!", "SUCCESS": "▶️ Трек перемотан!" } \ No newline at end of file diff --git a/languages/ru-RU/music/skip.json b/languages/ru-RU/music/skip.json index 56e6dea9..f94176e4 100644 --- a/languages/ru-RU/music/skip.json +++ b/languages/ru-RU/music/skip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Пропустить текущий трек", - "USAGE": "{{prefix}}skip", - "EXAMPLES": "{{prefix}}skip", + "USAGE": "skip", + "EXAMPLES": "skip", "NO_NEXT_SONG": "Очередь пуста!", "SUCCESS": "Трек пропущен!" } \ No newline at end of file diff --git a/languages/ru-RU/music/stop.json b/languages/ru-RU/music/stop.json index 87378706..ca51d821 100644 --- a/languages/ru-RU/music/stop.json +++ b/languages/ru-RU/music/stop.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Остановить воспроизведение очереди", - "USAGE": "{{prefix}}stop", - "EXAMPLES": "{{prefix}}stop", + "USAGE": "stop", + "EXAMPLES": "stop", "SUCCESS": "Воспроизведение остановлено!" } \ No newline at end of file diff --git a/languages/ru-RU/nsfw/nsfw.json b/languages/ru-RU/nsfw/nsfw.json index 17402804..cd1208b5 100644 --- a/languages/ru-RU/nsfw/nsfw.json +++ b/languages/ru-RU/nsfw/nsfw.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Получить NSFW изображение с выбранного или случайного сабреддита", - "USAGE": "{{prefix}}nsfw (тег/list)", - "EXAMPLES": "{{prefix}}nsfw\n{{prefix}}nsfw list", + "USAGE": "nsfw (тег/list)", + "EXAMPLES": "nsfw\nnsfw list", "SEARCHING": "Ищу изображение по тегу `{{tag}}`", "SEARCHING_RANDOM": "Ищу случайное изображение", "EMBED_TITLE": "Доступные категории", diff --git a/languages/ru-RU/owner/debug.json b/languages/ru-RU/owner/debug.json index f2fd39ed..6cafafc7 100644 --- a/languages/ru-RU/owner/debug.json +++ b/languages/ru-RU/owner/debug.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Позволяет изменять многие данные пользователя!", - "USAGE": "{{prefix}}debug [set/add] [level/xp/credits/bank/rep] [@пользователь] [значение]", - "EXAMPLES": "{{prefix}}debug set level @Jonny_Bro#4226 10000", + "USAGE": "debug [set/add] [level/xp/credits/bank/rep] [@пользователь] [значение]", + "EXAMPLES": "debug set level @Jonny_Bro#4226 10000", "INVALID_MEMBER": "Вы должны упомянуть пользователя!", "NO_ACTION": "Выберите действие: `set` или `add`!", "NO_STATUS": "Выберите параметр: `level`, `xp`, `credits`, `rep` или `bank`!", diff --git a/languages/ru-RU/owner/eval.json b/languages/ru-RU/owner/eval.json index 0e0b0507..29069e6a 100644 --- a/languages/ru-RU/owner/eval.json +++ b/languages/ru-RU/owner/eval.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Выполнить код!", - "USAGE": "{{prefix}}eval [код]", - "EXAMPLES": "{{prefix}}eval message.channel.send({ content: \"Hello World!\" })" + "USAGE": "код", + "EXAMPLES": "eval interaction.channel.send({ content: \"Hello World!\" })" } \ No newline at end of file diff --git a/languages/ru-RU/owner/reload.json b/languages/ru-RU/owner/reload.json index ad6908b9..879868c0 100644 --- a/languages/ru-RU/owner/reload.json +++ b/languages/ru-RU/owner/reload.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Перезагрузить команду!", - "USAGE": "{{prefix}}reload", - "EXAMPLES": "{{prefix}}reload help", + "USAGE": "reload", + "EXAMPLES": "reload help", "NOT_FOUND": "Команды `{{search}}` не существует!", "SUCCESS": "Команда `{{command}}` успешно перезагружена!" } \ No newline at end of file diff --git a/languages/ru-RU/owner/say.json b/languages/ru-RU/owner/say.json index 20bc9b47..ea1e7cfa 100644 --- a/languages/ru-RU/owner/say.json +++ b/languages/ru-RU/owner/say.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Написать сообщение от имени бота!", - "USAGE": "{{prefix}}say [текст] ++ (ID/название-канала) ++ (ID/название-сервера)", - "EXAMPLES": "{{prefix}}say Hello World!\n{{prefix}}say Hello World! ++ 123456789098765432" + "USAGE": "say [текст] ++ (ID/название-канала) ++ (ID/название-сервера)", + "EXAMPLES": "say Hello World!\nsay Hello World! ++ 123456789098765432" } \ No newline at end of file diff --git a/languages/ru-RU/owner/servers-list.json b/languages/ru-RU/owner/servers-list.json index b54e66f8..69a81a32 100644 --- a/languages/ru-RU/owner/servers-list.json +++ b/languages/ru-RU/owner/servers-list.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Показать список серверов бота!", - "USAGE": "{{prefix}}servers-list", - "EXAMPLES": "{{prefix}}servers-list" + "USAGE": "servers-list", + "EXAMPLES": "servers-list" } \ No newline at end of file diff --git a/languages/uk-UA/administration/addcommand.json b/languages/uk-UA/administration/addcommand.json index 8483d9b6..ac95f060 100644 --- a/languages/uk-UA/administration/addcommand.json +++ b/languages/uk-UA/administration/addcommand.json @@ -1,8 +1,8 @@ { "DESCRIPTION": "Створити власну команду!", - "USAGE": "{{prefix}}addcommand [назва] [відповідь]", - "EXAMPLES": "{{prefix}}addcommand hello Привіт, {user}. Добро пожаловать на {guild}!", + "USAGE": "addcommand [назва] [відповідь]", + "EXAMPLES": "addcommand hello Привіт, {user}. Добро пожаловать на {guild}!", "MISSING_NAME": "Укажіть назву команди!", "MISSING_ANSWER": "Укажіть відповідь команди!", - "SUCCESS": "Команда **{{prefix}}{{commandName}}** створена!" + "SUCCESS": "Команда **{{commandName}}** створена!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/addemoji.json b/languages/uk-UA/administration/addemoji.json index b31bce7c..6326c881 100644 --- a/languages/uk-UA/administration/addemoji.json +++ b/languages/uk-UA/administration/addemoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Додати ємодзі на сервер!", - "USAGE": "{{prefix}}addemoji [посилання-на-зображення] [назва]", - "EXAMPLES": "{{prefix}}addemoji https://via.placeholder.com/150 placeholder", + "USAGE": "addemoji [посилання-на-зображення] [назва]", + "EXAMPLES": "addemoji https://via.placeholder.com/150 placeholder", "MISSING_URL": "Укажіть посилання на зображення!", "MISSING_NAME": "Укажіть назву ємодзі!", "INVALID_NAME": "Назва ємодзі повинна бути від 2 до 32 символів!", diff --git a/languages/uk-UA/administration/automod.json b/languages/uk-UA/administration/automod.json index 1a443b7b..6e5cab81 100644 --- a/languages/uk-UA/administration/automod.json +++ b/languages/uk-UA/administration/automod.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Увімкнути або вимкнути автовидалення Discord запрошень", - "USAGE": "{{prefix}}automod [on/off] (#канал)", - "EXAMPLES": "{{prefix}}automod on\n{{prefix}}automod off #general\n{{prefix}}automod off", + "USAGE": "automod [on/off] (#канал)", + "EXAMPLES": "automod on\nautomod off #general\nautomod off", "MISSING_STATUS": "Вкажіть значення `on` або `off`!", - "ENABLED": "**Discord запрошення будуть автоматично видалятися!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}automod off #channel`, щоб ігнорувати канал!*", + "ENABLED": "**Discord запрошення будуть автоматично видалятися!**\n\n:arrow_right_hook: *Використовуйте `automod off #channel`, щоб ігнорувати канал!*", "DISABLED_CHANNEL": "Автомодерація не буде виконуватись в {{channel}}!", "DISABLED": "Автомодерація відключена на цьому сервері!", "DELETED": "Ваше повідомлення видалено, т.к. містило у собі посилання-запрошення!" diff --git a/languages/uk-UA/administration/autorole.json b/languages/uk-UA/administration/autorole.json index 7493b63a..f444d22c 100644 --- a/languages/uk-UA/administration/autorole.json +++ b/languages/uk-UA/administration/autorole.json @@ -1,10 +1,10 @@ { "DESCRIPTION": "Увімкнути або вимкнути автопризначення ролі при вході на сервер!", - "USAGE": "{{prefix}}autorole [on/off] (@роль)", - "EXAMPLES": "{{prefix}}autorole on @новенький\n{{prefix}}autorole off", + "USAGE": "autorole [on/off] (@роль)", + "EXAMPLES": "autorole on @новенький\nautorole off", "MISSING_STATUS": "Вкажіть значення `on` або `off`!", "MISSING_ROLE": "Вкажіть роль!", "SUCCESS_ENABLED": "Автопризначення ролі увімкнено! Нові користувачі автоматично отримуватимуть **{{roleName}}** під час входу на сервер.", - "ALREADY_DISABLED": "**Автопризначення ролі вже вимкнено.**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}autorole on @роль`, щоб увімкнути!*", - "SUCCESS_DISABLED": "**Автопризначення ролі вимкнено!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені налаштування!*" + "ALREADY_DISABLED": "**Автопризначення ролі вже вимкнено.**\n\n:arrow_right_hook: *Використовуйте `autorole on @роль`, щоб увімкнути!*", + "SUCCESS_DISABLED": "**Автопризначення ролі вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*" } \ No newline at end of file diff --git a/languages/uk-UA/administration/backup.json b/languages/uk-UA/administration/backup.json index 08686aa3..30d1c48d 100644 --- a/languages/uk-UA/administration/backup.json +++ b/languages/uk-UA/administration/backup.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Керування резервними копіями сервера!", - "USAGE": "{{prefix}}backup [create/load/info/remove]", - "EXAMPLES": "{{prefix}}backup create\n{{prefix}}backup load 123456789098765432\n{{prefix}}backup info 123456789098765432", + "USAGE": "backup [create/load/info/remove]", + "EXAMPLES": "backup create\nbackup load 123456789098765432\nbackup info 123456789098765432", "MISSING_STATUS": "Виберіть дію: `create`, `load`, `info` або `remove`!", "MISSING_BACKUP_ID": "Вкажіть ID резервної копії!", "NO_BACKUP_FOUND": "Резервну копію з ID `{{backupID}}` не знайдено", diff --git a/languages/uk-UA/administration/configuration.json b/languages/uk-UA/administration/configuration.json index e9c93093..21111f51 100644 --- a/languages/uk-UA/administration/configuration.json +++ b/languages/uk-UA/administration/configuration.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати конфігурацію сервера!", - "USAGE": "{{prefix}}configuration", - "EXAMPLES": "{{prefix}}configuration", + "USAGE": "configuration", + "EXAMPLES": "configuration", "PREFIX_TITLE": "Префікс", "IGNORED_CHANNELS_TITLE": "Ігноровані канали", "NO_IGNORED_CHANNELS": "Немає каналів, що ігноруються.", diff --git a/languages/uk-UA/administration/delcommand.json b/languages/uk-UA/administration/delcommand.json index e30a8d09..a424af90 100644 --- a/languages/uk-UA/administration/delcommand.json +++ b/languages/uk-UA/administration/delcommand.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Видалити власну команду!", - "USAGE": "{{prefix}}delcommand [назва]", - "EXAMPLES": "{{prefix}}delcommand hello", + "USAGE": "delcommand [назва]", + "EXAMPLES": "delcommand hello", "MISSING_NAME": "Введіть назву команди!", "UNKNOWN_COMMAND": "Команда {{commandName}} не існує!", "SUCCESS": "Команда {{commandName}} була видалена з серверу!" diff --git a/languages/uk-UA/administration/deletemod.json b/languages/uk-UA/administration/deletemod.json index b120d54f..e28d90f1 100644 --- a/languages/uk-UA/administration/deletemod.json +++ b/languages/uk-UA/administration/deletemod.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Увімкнути або вимкнути автовидалення команд модерації!", - "USAGE": "{{prefix}}deletemod [on/off]", - "EXAMPLES": "{{prefix}}deletemod on", + "USAGE": "deletemod [on/off]", + "EXAMPLES": "deletemod on", "MISSING_STATUS": "Укажыть значення `on` або `off`!", "ENABLED": "Автовидалення команд модерації увімкнено!", "DISABLED": "Автовидалення команд модерації вимкнено!" diff --git a/languages/uk-UA/administration/goodbye.json b/languages/uk-UA/administration/goodbye.json index ac1401c0..842a03c8 100644 --- a/languages/uk-UA/administration/goodbye.json +++ b/languages/uk-UA/administration/goodbye.json @@ -1,16 +1,16 @@ { "DESCRIPTION": "Увімкнути або вимкнути повідомлення при виході користувача з сервера!", - "USAGE": "{{prefix}}goodbye (edit/off/test)", - "EXAMPLES": "{{prefix}}goodbye\n{{prefix}}goodbye test", + "USAGE": "goodbye (edit/off/test)", + "EXAMPLES": "goodbye\ngoodbye test", "MISSING_STATUS": "Виберіть дію: `edit`, `off` або `test`!", "DEFAULT_MESSAGE": "Бувай, {user}! Нас тепер {membercount} без тебе :'(", "TEST_SUCCESS": "Тест виконано!", "FORM_1": "**У який канал надсилатимуться повідомлення?**\n\n:arrow_right_hook: *Надішліть згадку каналу!*", "FORM_2": "**Вкажіть ваше повідомлення.**\n\n**Якщо необхідно:**\n*-* __Згадати користувача__: {user}\n*-* __Кількість учасників__: {membercount}\n*- * __Назва сервера__: {server}\n\n**Наприклад:**\nБувай, {user}, ми будемо нудьгувати!Тепер нас {membercount}.\n:fast_forward:\nБувай, {{author}}, ми будемо нудьгувати! Тепер нас {{memberCount}}.", "FORM_3": "**Ви хочете додати картку до повідомлення?**\n\n:arrow_right_hook: *Надішліть `так` або `ні`!*", - "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}goodbye test` для перегляду вашого повідомлення!*", + "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Використовуйте `goodbye test` для перегляду вашого повідомлення!*", "MAX_CHARACT": "Ваше повідомлення не повинно перевищувати 1800 символів!", - "DISABLED": "**Повідомлення вимкнено!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені налаштування!*", + "DISABLED": "**Повідомлення вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", "IMG_GOODBYE": "Вийшов з {{server}}!", "TITLE": "До зустрічі!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/ignore.json b/languages/uk-UA/administration/ignore.json index 8507d703..c9a71908 100644 --- a/languages/uk-UA/administration/ignore.json +++ b/languages/uk-UA/administration/ignore.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Увімкнути або вимкнути використання команд у каналі", - "USAGE": "{{prefix}}ignore [канал]", - "EXAMPLES": "{{prefix}}ignore #основний", + "USAGE": "ignore [канал]", + "EXAMPLES": "ignore #основний", "ALLOWED": "Тепер команди в {{channel}} дозволені!", "IGNORED": "Тепер команди в {{channel}} заборонені!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/set.json b/languages/uk-UA/administration/set.json index 3441cd2f..702d9d7e 100644 --- a/languages/uk-UA/administration/set.json +++ b/languages/uk-UA/administration/set.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Змінити користувачеві досвід, рівень, кредити або банк!", - "USAGE": "{{prefix}}set [level/xp/credits/bank] [@користувач] [значення]", - "EXAMPLES": "{{prefix}}set level @Jonny_Bro#4226 10", + "USAGE": "set [level/xp/credits/bank] [@користувач] [значення]", + "EXAMPLES": "set level @Jonny_Bro#4226 10", "INVALID_MEMBER": "Ви повинні згадати користувача!", "NO_STATUS": "Виберіть значення: `level`, `xp`, `credits` або `bank`!", "BOT_USER": "Ви не можете змінити статистику робота!", diff --git a/languages/uk-UA/administration/setbirthdays.json b/languages/uk-UA/administration/setbirthdays.json index 7d2b7437..0d6b3bc9 100644 --- a/languages/uk-UA/administration/setbirthdays.json +++ b/languages/uk-UA/administration/setbirthdays.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Встановити канал для вітання з днем народження!", - "USAGE": "{{prefix}}setbirthdays (#канал)", - "EXAMPLES": "{{prefix}}setbirthdays #дні-народження\n{{prefix}}setbirthdays", + "USAGE": "setbirthdays (#канал)", + "EXAMPLES": "setbirthdays #дні-народження\nsetbirthdays", "ENABLED": "Привітання включені в канал **{{channel}}**!", "DISABLED": "Вітання відключені!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/setlang.json b/languages/uk-UA/administration/setlang.json index e2577d05..72934142 100644 --- a/languages/uk-UA/administration/setlang.json +++ b/languages/uk-UA/administration/setlang.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Змінити мову бота на сервері!", - "USAGE": "{{prefix}}setlang [мова]", - "EXAMPLES": "{{prefix}}setlang ru\n{{prefix}}setlang uk", + "USAGE": "setlang [мова]", + "EXAMPLES": "setlang ru\nsetlang uk", "MISSING_LANG": "Виберіть мову зі списку: {{list}}", "SUCCESS": ":flag_ua: Мова сервера змінена на **{{lang}}**!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/setmodlogs.json b/languages/uk-UA/administration/setmodlogs.json index 2ceaf42a..0fbc9503 100644 --- a/languages/uk-UA/administration/setmodlogs.json +++ b/languages/uk-UA/administration/setmodlogs.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Встановити канал для логів модерації!", -"USAGE": "{{prefix}}setmodlogs (#канал)", -"EXAMPLES": "{{prefix}}setmodlogs #логи\n{{prefix}}setmodlogs", +"USAGE": "setmodlogs (#канал)", +"EXAMPLES": "setmodlogs #логи\nsetmodlogs", "ENABLED": "Логи модерації включені в канал **{{channel}}**!", "DISABLED": "Логи модерації вимкнені!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/setprefix.json b/languages/uk-UA/administration/setprefix.json index 3a2abbe5..7757638c 100644 --- a/languages/uk-UA/administration/setprefix.json +++ b/languages/uk-UA/administration/setprefix.json @@ -1,8 +1,8 @@ { "DESCRIPTION": "Встановити префікс на сервері!", - "USAGE": "{{prefix}}setprefix [префікс]", - "EXAMPLES": "{{prefix}}setprefix $", + "USAGE": "setprefix [префікс]", + "EXAMPLES": "setprefix $", "MISSING_PREFIX": "Вкажіть префікс!", "TOO_LONG": "Префікс не може бути довшим за 5 символів!", - "SUCCESS": "Префікс бота змінено на `{{prefix}}`!" + "SUCCESS": "Префікс бота змінено на ``!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/setreports.json b/languages/uk-UA/administration/setreports.json index 9921894f..da8f5745 100644 --- a/languages/uk-UA/administration/setreports.json +++ b/languages/uk-UA/administration/setreports.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Встановити канал для скарг!", - "USAGE": "{{prefix}}setreports (#канал)", - "EXAMPLES": "{{prefix}}setreports #скарги\n{{prefix}}setreports", + "USAGE": "setreports (#канал)", + "EXAMPLES": "setreports #скарги\nsetreports", "ENABLED": "Скарги надсилатимуться в **{{channel}}**!", "DISABLED": "Скарги відключені!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/setsuggests.json b/languages/uk-UA/administration/setsuggests.json index f9c0e1b2..11e16108 100644 --- a/languages/uk-UA/administration/setsuggests.json +++ b/languages/uk-UA/administration/setsuggests.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Встановити канал для пропозицій!", - "USAGE": "{{prefix}}setsuggests (#канал)", - "EXAMPLES": "{{prefix}}setsuggests #пропозиції\n{{prefix}}setsuggests", + "USAGE": "setsuggests (#канал)", + "EXAMPLES": "setsuggests #пропозиції\nsetsuggests", "ENABLED": "Пропозиції надсилатимуться в **{{channel}}**!", "DISABLED": "Пропозиції вимкнено!" } \ No newline at end of file diff --git a/languages/uk-UA/administration/stealemoji.json b/languages/uk-UA/administration/stealemoji.json index 3a69ef0a..c25ab2cb 100644 --- a/languages/uk-UA/administration/stealemoji.json +++ b/languages/uk-UA/administration/stealemoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Вкрасти емодзі на даний сервер з іншого!", - "USAGE": "{{prefix}}stealemoji [емодзі]", - "EXAMPLES": "{{prefix}}stealemoji :coolstorybob:", + "USAGE": "stealemoji [емодзі]", + "EXAMPLES": "stealemoji :coolstorybob:", "MISSING_EMOJI": "Вкажіть емодзі!", "SUCCESS": "{{emoji}} додано!", "ERROR": "{{emoji}} не було додано. Перевірте, чи є місце для додавання емоди!" diff --git a/languages/uk-UA/administration/welcome.json b/languages/uk-UA/administration/welcome.json index 46dce3d4..78a54670 100644 --- a/languages/uk-UA/administration/welcome.json +++ b/languages/uk-UA/administration/welcome.json @@ -1,16 +1,16 @@ { "DESCRIPTION": "Увімкнути або вимкнути повідомлення під час входу користувача на сервер!", - "USAGE": "{{prefix}}welcome (edit/off/test)", - "EXAMPLES": "{{prefix}}welcome\n{{prefix}}welcome test", + "USAGE": "welcome (edit/off/test)", + "EXAMPLES": "welcome\nwelcome test", "MISSING_STATUS": "Виберіть дію: `edit`, `off` або `test`!", "DEFAULT_MESSAGE": "Ласкаво просимо до {server}, {user}, тепер нас {membercount}! Ваш обліковий запис було створено {createdat}.", "TEST_SUCCESS": "Тест виконано!", "FORM_1": "**У який канал надсилатимуться повідомлення?**\n\n:arrow_right_hook: *Надішліть згадку каналу!*", "FORM_2": "**Вкажіть ваше повідомлення.**\n\n**Якщо необхідно:**\n*-* __Згадати користувача__: {user}\n*-* __Кількість учасників__: {membercount}\n*- * __Назва сервера__: {server}\n\n**Наприклад:**\nЛаскаво просимо на сервер {server}, {user}!Тепер нас {membercount}!\n:fast_forward:\nЛаскаво просимо на сервер {{guildName} }, {{author}}! Тепер нас {{memberCount}}!", "FORM_3": "**Ви хочете додати картку до повідомлення?**\n\n:arrow_right_hook: *Надішліть `так` або `ні`!*", - "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}welcome test` для перегляду вашого вітального повідомлення!*", + "FORM_SUCCESS": "**Готово!**\n\n:arrow_right_hook: *Використовуйте `welcome test` для перегляду вашого вітального повідомлення!*", "MAX_CHARACT": "Ваше повідомлення не повинно перевищувати 1800 символів!", - "DISABLED": "**Повідомлення вимкнено!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені настройки!*", + "DISABLED": "**Повідомлення вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені настройки!*", "IMG_WELCOME": "Ласкаво просимо до {{server}}!", "TITLE": "Ласкаво просимо!" } \ No newline at end of file diff --git a/languages/uk-UA/economy/achievements.json b/languages/uk-UA/economy/achievements.json index 356ad110..ab523a63 100644 --- a/languages/uk-UA/economy/achievements.json +++ b/languages/uk-UA/economy/achievements.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати список ваших досягнень!", - "USAGE": "{{prefix}}achievements", - "EXAMPLES": "{{prefix}}achievements", + "USAGE": "achievements", + "EXAMPLES": "achievements", "SEND_CMD": "Використотайте свою першу команду!", "CLAIM_SALARY": "Отримайте зарплату 10 разів!", "MARRY": "Знайдіть свою половинку і одружіться!", diff --git a/languages/uk-UA/economy/birthdate.json b/languages/uk-UA/economy/birthdate.json index 5a1bf986..ee19cb21 100644 --- a/languages/uk-UA/economy/birthdate.json +++ b/languages/uk-UA/economy/birthdate.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Встановити дату народження", - "USAGE": "{{prefix}}birthdate [ДД/ММ/РРРР]", - "EXAMPLES": "{{prefix}}birthdate 01/01/2010", + "USAGE": "birthdate [ДД/ММ/РРРР]", + "EXAMPLES": "birthdate 01/01/2010", "MISSING_DATE": "Вкажіть дату у форматі 20/11/2003", "INVALID_DATE": "Використовуйте цей формат: ДД/ММ/РРРР. Наприклад, `1 січня 2010` буде `01/01/2010`.", "DATE_TOO_LOW": "Вам більше 80 років? :eyes:", diff --git a/languages/uk-UA/economy/deposit.json b/languages/uk-UA/economy/deposit.json index d83d58fe..6ed6cda6 100644 --- a/languages/uk-UA/economy/deposit.json +++ b/languages/uk-UA/economy/deposit.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Внести кредити до банку", - "USAGE": "{{prefix}}deposit [сума/all]", - "EXAMPLES": "{{prefix}}deposit 1000\n{{prefix}}deposit all", + "USAGE": "deposit [сума/all]", + "EXAMPLES": "deposit 1000\ndeposit all", "MISSING_AMOUNT": "Вкажіть суму!", "NO_CREDIT": "У вас немає кредитів!", "NOT_ENOUGH_CREDIT": "У вас немає `{{money}}`!", diff --git a/languages/uk-UA/economy/divorce.json b/languages/uk-UA/economy/divorce.json index 59805b4d..6fc9562c 100644 --- a/languages/uk-UA/economy/divorce.json +++ b/languages/uk-UA/economy/divorce.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Розлучитися з користувачем!", - "USAGE": "{{prefix}}divorce", - "EXAMPLES": "{{prefix}}divorce", + "USAGE": "divorce", + "EXAMPLES": "divorce", "NOT_MARRIED": "Ви не одружені!", "DIVORCED": "Ви розлучилися з **{{username}}**!", "DIVORCED_U": "**{{username}}** розлучився з вами!" diff --git a/languages/uk-UA/economy/findwords.json b/languages/uk-UA/economy/findwords.json index 84d6c278..cd1626fe 100644 --- a/languages/uk-UA/economy/findwords.json +++ b/languages/uk-UA/economy/findwords.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Вгадай задумане мною слово!", - "USAGE": "{{prefix}}findwords (STOP)", - "EXAMPLES": "{{prefix}}findwords", + "USAGE": "findwords (STOP)", + "EXAMPLES": "findwords", "INVALID_WORD": "{{member}} | Це слово не існує або я його не знаю :(", "GAME_STARTING": ":timer: | Гра розпочнеться через 10 секунд!\nНапишіть STOP, якщо хочете зупинити гру!", "FIND_WORD": "20 секунд, щоб знайти слово, в якому є **{{word}}**!", diff --git a/languages/uk-UA/economy/horserace.json b/languages/uk-UA/economy/horserace.json index 6b136df2..6b144d6c 100644 --- a/languages/uk-UA/economy/horserace.json +++ b/languages/uk-UA/economy/horserace.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Кінні перегони!", - "USAGE": "{{prefix}}horserace [create/bet/go]", - "EXAMPLES": "{{prefix}}horserace create\n{{prefix}}horserace bet 3 100", + "USAGE": "horserace [create/bet/go]", + "EXAMPLES": "horserace create\nhorserace bet 3 100", "MISSING_STATUS": "Виберіть параметр: `create`, `bet` або `go`!", "HORSE_NUM": "На перегонах всього 5 коней!", "EMBED_T": "Кінні перегони", diff --git a/languages/uk-UA/economy/leaderboard.json b/languages/uk-UA/economy/leaderboard.json index 02d5b884..62e9e706 100644 --- a/languages/uk-UA/economy/leaderboard.json +++ b/languages/uk-UA/economy/leaderboard.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати таблиці лідерів за кредитами, рівнем або очками репутації!", - "USAGE": "{{prefix}}leaderboard [rep/level/credits]", - "EXAMPLES": "{{prefix}}leaderboard credits\n{{prefix}}leaderboard level", + "USAGE": "leaderboard [rep/level/credits]", + "EXAMPLES": "leaderboard credits\nleaderboard level", "MISSING_TYPE": "Виберіть таблицю: `credits`, `level` або `rep`!", "MOBILE": ":confused: Я помітив, що ви онлайн з телефону... Таблиця лідерів може відображатися некоректно на маленьких екранах. Спробуйте пізніше з іншого пристрою!", "TABLE": "Таблиця лідерів {{name}}", diff --git a/languages/uk-UA/economy/marry.json b/languages/uk-UA/economy/marry.json index 820b0a4a..0035a1f5 100644 --- a/languages/uk-UA/economy/marry.json +++ b/languages/uk-UA/economy/marry.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Одружуйтеся з тим, кого кохаєте!", - "USAGE": "{{prefix}}marry [@користувач]", - "EXAMPLES": "{{prefix}}marry @Jonny_Bro#4226", + "USAGE": "marry [@користувач]", + "EXAMPLES": "marry @Jonny_Bro#4226", "INVALID_MEMBER": "Ви повинні згадати користувача!", - "ALREADY_MARRIED": "Ви вже одружені! Ви можете розлучитися за допомогою команди `{{prefix}}divorce`.", + "ALREADY_MARRIED": "Ви вже одружені! Ви можете розлучитися за допомогою команди `divorce`.", "ALREADY_MARRIED_USER": "Місце зайняте! **{{username}}** вже одружений!", "YOURSELF": "Ви не можете одружитися з собою!", "REQUEST_AUTHOR_TO_AMEMBER": "Ви вже надіслали пропозицію **{{username}}**!", diff --git a/languages/uk-UA/economy/money.json b/languages/uk-UA/economy/money.json index f960d372..bb7b737f 100644 --- a/languages/uk-UA/economy/money.json +++ b/languages/uk-UA/economy/money.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показати кількість кредитів у користувача", - "USAGE": "{{prefix}}money (@користувач)", - "EXAMPLES": "{{prefix}}money\n{{prefix}}money @Jonny_Bro#4226", + "USAGE": "money (@користувач)", + "EXAMPLES": "money\nmoney @Jonny_Bro#4226", "TITLE": "{{username}} Кредити" } \ No newline at end of file diff --git a/languages/uk-UA/economy/number.json b/languages/uk-UA/economy/number.json index 6e255833..7b774be7 100644 --- a/languages/uk-UA/economy/number.json +++ b/languages/uk-UA/economy/number.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Вгадай загадане мною число!", - "USAGE": "{{prefix}}number (STOP)", - "EXAMPLES": "{{prefix}}number", + "USAGE": "number (STOP)", + "EXAMPLES": "number", "GAME_START": "Я загадав число, починайте!\nНапишіть STOP, якщо хочете зупинити гру!", "BIG": "{{user}} | Моє число **більше**, ніж `{{number}}`!", "SMALL": "{{user}} | Моє число **менше** ніж `{{number}}`!", diff --git a/languages/uk-UA/economy/pay.json b/languages/uk-UA/economy/pay.json index b589f6cd..7376c374 100644 --- a/languages/uk-UA/economy/pay.json +++ b/languages/uk-UA/economy/pay.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Надіслати кредити користувачу!", - "USAGE": "{{prefix}}pay [@користувач] [сума]", - "EXAMPLES": "{{prefix}}pay @Jonny_Bro#4226 1000", + "USAGE": "pay [@користувач] [сума]", + "EXAMPLES": "pay @Jonny_Bro#4226 1000", "INVALID_MEMBER": "Ви повинні згадати користувача!", "BOT_USER": "Ботам не потрібні кредити!", "YOURSELF": "Ви не можете заплатити самому собі!", diff --git a/languages/uk-UA/economy/profile.json b/languages/uk-UA/economy/profile.json index a6c952bb..3a56359b 100644 --- a/languages/uk-UA/economy/profile.json +++ b/languages/uk-UA/economy/profile.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати профіль користувача", - "USAGE": "{{prefix}}profile (@користувач)", - "EXAMPLES": "{{prefix}}profile\n{{prefix}}profile @Jonny_Bro#4226", + "USAGE": "profile (@користувач)", + "EXAMPLES": "profile\nprofile @Jonny_Bro#4226", "BOT_USER": "Боти не мають профілю!", "TITLE": "Профіль {{username}}", "LINK": "Профіль", @@ -20,5 +20,5 @@ "REGISTERED": "📅 Профіль створено", "NO_LOVER": "Вільний", "ACHIEVEMENTS": "🔥 Досягнення", - "ACHIEVEMENTS_CONTENT": "Отримайте більше інформації за допомогою `{{prefix}}achievements`!" + "ACHIEVEMENTS_CONTENT": "Отримайте більше інформації за допомогою `achievements`!" } \ No newline at end of file diff --git a/languages/uk-UA/economy/rep.json b/languages/uk-UA/economy/rep.json index 0cccd498..cef1d247 100644 --- a/languages/uk-UA/economy/rep.json +++ b/languages/uk-UA/economy/rep.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Дати очко репутації користувачеві!", - "USAGE": "{{prefix}}rep [@пользователь]", - "EXAMPLES": "{{prefix}}rep @Jonny_Bro#4226", + "USAGE": "rep [@пользователь]", + "EXAMPLES": "rep @Jonny_Bro#4226", "COOLDOWN": "Ви повинні почекати **{{time}}** до наступного використання!", "INVALID_USER": "Ви повинні згадати користувача!", "BOT_USER": "Боти і так круті!", diff --git a/languages/uk-UA/economy/rob.json b/languages/uk-UA/economy/rob.json index f0098924..223aaae9 100644 --- a/languages/uk-UA/economy/rob.json +++ b/languages/uk-UA/economy/rob.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Спробувати пограбувати користувача!", - "USAGE": "{{prefix}}rob [@користувач] [сума]", - "EXAMPLES": "{{prefix}}rob @Jonny_Bro#4226 100", + "USAGE": "rob [@користувач] [сума]", + "EXAMPLES": "rob @Jonny_Bro#4226 100", "BOT_USER": "Ви не можете пограбувати бота!", "YOURSELF": "Ви не можете пограбувати себе!", "MISSING_MEMBER": "Ви повинні згадати користувача!", diff --git a/languages/uk-UA/economy/setbio.json b/languages/uk-UA/economy/setbio.json index 37fb3f12..6689cdf2 100644 --- a/languages/uk-UA/economy/setbio.json +++ b/languages/uk-UA/economy/setbio.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Встановити біографію!", - "USAGE": "{{prefix}}setbio [текст]", - "EXAMPLES": "{{prefix}}setbio Мене звуть Жоня, мені 18 і я творець JaBa :)", + "USAGE": "setbio [текст]", + "EXAMPLES": "setbio Мене звуть Жоня, мені 18 і я творець JaBa :)", "MISSING": "Вкажіть біографію!", "MAX_CHARACT": "Ваша біографія не повинна перевищувати 100 символів!", "SUCCESS": "Ваша біографія змінена!" diff --git a/languages/uk-UA/economy/slots.json b/languages/uk-UA/economy/slots.json index 0da3a7fe..d3ef0d1d 100644 --- a/languages/uk-UA/economy/slots.json +++ b/languages/uk-UA/economy/slots.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Казино \"JaBa Casino\"", - "USAGE": "{{prefix}}slots (сума)", - "EXAMPLES": "{{prefix}}slots\n{{prefix}}slots 100", + "USAGE": "slots (сума)", + "EXAMPLES": "slots\nslots 100", "DEFEAT": "**{{username}}** поставив {{money}} і все програв.", "VICTORY": "**{{username}}** поставив {{money}} і виграв {{won}}!", "NOT_ENOUGH": "У вас немає {{money}}." diff --git a/languages/uk-UA/economy/tictactoe.json b/languages/uk-UA/economy/tictactoe.json index b9d68067..5a80b4ee 100644 --- a/languages/uk-UA/economy/tictactoe.json +++ b/languages/uk-UA/economy/tictactoe.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Хрестики-нуліки!", - "USAGE": "{{prefix}}tictactoe [@користувач]", - "EXAMPLES": "{{prefix}}tictactoe @Jonny_Bro#4226", + "USAGE": "tictactoe [@користувач]", + "EXAMPLES": "tictactoe @Jonny_Bro#4226", "NO_USER": "Вкажіть користувача!", "BOT_USER": "Ви не можете грати проти бота!", "YOURSELF": "Ви не можете грати із самим собою!", diff --git a/languages/uk-UA/economy/transactions.json b/languages/uk-UA/economy/transactions.json index 428bcb6c..4b9a50b5 100644 --- a/languages/uk-UA/economy/transactions.json +++ b/languages/uk-UA/economy/transactions.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Подивитися історію транзакцій!", - "USAGE": "{{prefix}}transactions", - "EXAMPLES": "{{prefix}}transactions", + "USAGE": "transactions", + "EXAMPLES": "transactions", "NO_TRANSACTIONS": "У вас немає транзакцій.", "EMBED_TRANSACTIONS": "Ваші транзакції", "BANK": "Банк", diff --git a/languages/uk-UA/economy/withdraw.json b/languages/uk-UA/economy/withdraw.json index ceab2713..be626928 100644 --- a/languages/uk-UA/economy/withdraw.json +++ b/languages/uk-UA/economy/withdraw.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Зняти кредити з банку!", - "USAGE": "{{prefix}}withdraw [сума/all]", - "EXAMPLES": "{{prefix}}withdraw 100\n{{prefix}}withdraw all", + "USAGE": "withdraw [сума/all]", + "EXAMPLES": "withdraw 100\nwithdraw all", "MISSING_AMOUNT": "Вкажіть суму!", "NO_CREDIT": "Недостатньо кредитів на банківському рахунку!", "NOT_ENOUGH": "У вас має бути хоча б `{{money}}`!", diff --git a/languages/uk-UA/economy/work.json b/languages/uk-UA/economy/work.json index 0bc37123..e1945f43 100644 --- a/languages/uk-UA/economy/work.json +++ b/languages/uk-UA/economy/work.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отримати зарплату!", - "USAGE": "{{prefix}}work", - "EXAMPLES": "{{prefix}}work", + "USAGE": "work", + "EXAMPLES": "work", "COOLDOWN": "Ви повинні почекати **{{time}}** до наступної зарплати!", "AWARD": "Закінчіть слово AWARD щоб отримати 200 додаткових кредитів!", "SALARY": "Зарплата", diff --git a/languages/uk-UA/fun/8ball.json b/languages/uk-UA/fun/8ball.json index b3b84ca4..d9b4b3d0 100644 --- a/languages/uk-UA/fun/8ball.json +++ b/languages/uk-UA/fun/8ball.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Я говорю правду!", - "USAGE": "{{prefix}}8ball [питання?]", - "EXAMPLES": "{{prefix}}8ball JaBa крутий?", + "USAGE": "8ball [питання?]", + "EXAMPLES": "8ball JaBa крутий?", "ERR_QUESTION": "Введіть питання!", "RESPONSE_1": "Безперечно", "RESPONSE_2": "Це продумали ще боги", diff --git a/languages/uk-UA/fun/ascii.json b/languages/uk-UA/fun/ascii.json index 5c0c638b..2af45e4e 100644 --- a/languages/uk-UA/fun/ascii.json +++ b/languages/uk-UA/fun/ascii.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Перетворити текст на ASCII код! Підтримуються лише англійські літери та цифри!", - "USAGE": "{{prefix}}ascii [текст]", - "EXAMPLES": "{{prefix}}ascii Hello world!", + "USAGE": "ascii [текст]", + "EXAMPLES": "ascii Hello world!", "TEXT_MISSING": "Введіть текст (не більше 20 символів)!" } \ No newline at end of file diff --git a/languages/uk-UA/fun/choice.json b/languages/uk-UA/fun/choice.json index 7b8455dd..f0ce0b68 100644 --- a/languages/uk-UA/fun/choice.json +++ b/languages/uk-UA/fun/choice.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Я можу допомогти вам із вибором!", - "USAGE": "{{prefix}}choice [варіант1/варіант2/варіант3/варіант4...]", - "EXAMPLES": "{{prefix}}choice Вода/Вогонь/Вітер", + "USAGE": "choice [варіант1/варіант2/варіант3/варіант4...]", + "EXAMPLES": "choice Вода/Вогонь/Вітер", "MISSING": "Вкажіть більше двох варіантів!\n(або використовуйте команду `flip`)", "EMPTY": "Здається, один з варіантів відсутній... Спробуйте ще раз!", "PROGRESS": "Думаю...", diff --git a/languages/uk-UA/fun/flip.json b/languages/uk-UA/fun/flip.json index ee48c5ee..e7cd27c0 100644 --- a/languages/uk-UA/fun/flip.json +++ b/languages/uk-UA/fun/flip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Підкинути монетку!", - "USAGE": "{{prefix}}flip", - "EXAMPLES": "{{prefix}}flip", + "USAGE": "flip", + "EXAMPLES": "flip", "HEADS": ":coin: | Чіт!", "TAILS": ":coin: | Лишка!" } \ No newline at end of file diff --git a/languages/uk-UA/fun/lmg.json b/languages/uk-UA/fun/lmg.json index f4900d8a..362249a9 100644 --- a/languages/uk-UA/fun/lmg.json +++ b/languages/uk-UA/fun/lmg.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Створити LMGTFY (давай я загуглю це для тебе) посилання", - "USAGE": "{{prefix}}lmg [запит]", - "EXAMPLES": "{{prefix}}lmg Як створити Discord бота?", + "USAGE": "lmg [запит]", + "EXAMPLES": "lmg Як створити Discord бота?", "MISSING": "Вкажіть запит!" } \ No newline at end of file diff --git a/languages/uk-UA/fun/lovecalc.json b/languages/uk-UA/fun/lovecalc.json index 4d787fdd..11111af4 100644 --- a/languages/uk-UA/fun/lovecalc.json +++ b/languages/uk-UA/fun/lovecalc.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Калькулятор кохання", - "USAGE": "{{prefix}}lovecalc [@користувач1] (@користувач2)", - "EXAMPLES": "{{prefix}}lovecalc @Jonny_Bro#4226\n{{prefix}}lovecalc @Jonny_Bro#4226 @JaBa#9042", + "USAGE": "lovecalc [@користувач1] (@користувач2)", + "EXAMPLES": "lovecalc @Jonny_Bro#4226\nlovecalc @Jonny_Bro#4226 @JaBa#9042", "MISSING": "Ви повинні згадати одного або двох користувачів!", "CONTENT": "Я думаю, що **{{firstUsername}}** на **{{percent}}%** кохає **{{secondUsername}}**!" } \ No newline at end of file diff --git a/languages/uk-UA/fun/memes.json b/languages/uk-UA/fun/memes.json index 50b60dfb..8dfff19f 100644 --- a/languages/uk-UA/fun/memes.json +++ b/languages/uk-UA/fun/memes.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отримати мем із вибраного або випадкового сабреддита", - "USAGE": "{{prefix}}memes (тег)", - "EXAMPLES": "{{prefix}}memes\n{{prefix}}memes me_irl", + "USAGE": "memes (тег)", + "EXAMPLES": "memes\nmemes me_irl", "SEARCHING": "Шукаю мем за тегом `{{tag}}`...", "SEARCHING_RANDOM": "Шукаю випадковий мем...", "EMBED_TITLE": "Доступні категорії", diff --git a/languages/uk-UA/general/activity.json b/languages/uk-UA/general/activity.json index ab935e88..2045292f 100644 --- a/languages/uk-UA/general/activity.json +++ b/languages/uk-UA/general/activity.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Створити активність у голосовому каналі!", - "USAGE": "{{prefix}}activity (активність)", - "EXAMPLES": "{{prefix}}activity\n{{prefix}}activity chess", + "USAGE": "activity (активність)", + "EXAMPLES": "activity\nactivity chess", "TITLE": "Список доступних активностей", "FOOTER": "JaBa | Discord Together", "NO_BOOST": "Необхідний перший рівень буста або вище!" diff --git a/languages/uk-UA/general/emoji.json b/languages/uk-UA/general/emoji.json index 62bf220c..4b4ffd7e 100644 --- a/languages/uk-UA/general/emoji.json +++ b/languages/uk-UA/general/emoji.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати інформацію про емодзі!", - "USAGE": "{{prefix}}emoji [емодзі]", - "EXAMPLES": "{{prefix}}emoji :tada:", + "USAGE": "emoji [емодзі]", + "EXAMPLES": "emoji :tada:", "TITLE": "Інформація про {{emoji}}", "NAME": "Назва", "ANIMATED": "Анімований", diff --git a/languages/uk-UA/general/help.json b/languages/uk-UA/general/help.json index 6be7bf3d..5ad1d5cf 100644 --- a/languages/uk-UA/general/help.json +++ b/languages/uk-UA/general/help.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати список команд або допомогу по цій команді.", - "USAGE": "{{prefix}}help (команда)", - "EXAMPLES": "{{prefix}}help\n{{prefix}}help ping", + "USAGE": "help (команда)", + "EXAMPLES": "help\nhelp ping", "CUSTOM": "У доданих команд немає опису.", "NOT_FOUND": "Команда `{{search}}` не існує", "FIELD_USAGE": "Використання", @@ -10,7 +10,7 @@ "FIELD_EXAMPLES": "Приклади", "NO_ALIAS": "Немає скорочень", "CMD_TITLE": "Допомога з {{cmd}}", - "INFO": "● Щоб отримати допомогу по певній команді, використовуйте `{{prefix}}help <команда>`!", + "INFO": "● Щоб отримати допомогу по певній команді, використовуйте `help <команда>`!", "CUSTOM_COMMANDS": "Додана команда", "FIELD_PERMISSIONS": "Необхідні права", "NO_REQUIRED_PERMISSION": "Ніякі особливі права не потрібні для використання цієї команди.", diff --git a/languages/uk-UA/general/invite.json b/languages/uk-UA/general/invite.json index b7e3697d..135550af 100644 --- a/languages/uk-UA/general/invite.json +++ b/languages/uk-UA/general/invite.json @@ -1,10 +1,10 @@ { "DESCRIPTION": "Отримати посилання на запрошення JaBa!", - "USAGE": "{{prefix}}invite (copy)", - "EXAMPLES": "{{prefix}}invite\n{{prefix}}invite copy", + "USAGE": "invite (copy)", + "EXAMPLES": "invite\ninvite copy", "LINKS": "Посилання JaBa", "CLICK": "[**Тик**]({{link}})", - "TIP": "Відправте `{{prefix}}invite copy`, щоб отримати посилання для копіювання!", + "TIP": "Відправте `invite copy`, щоб отримати посилання для копіювання!", "ADD": "Запросити JaBa", "VOTE": "Проголосувати за JaBa", "SUPPORT": "Підтримати розробника" diff --git a/languages/uk-UA/general/invites.json b/languages/uk-UA/general/invites.json index ebde8207..c772158d 100644 --- a/languages/uk-UA/general/invites.json +++ b/languages/uk-UA/general/invites.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати кількість користувачів, яких користувач запросив на сервер!", - "USAGE": "{{prefix}}invites (@користувач)", - "EXAMPLES": "{{prefix}}invites\n{{prefix}}invites @Jonny_Bro#4226", + "USAGE": "invites (@користувач)", + "EXAMPLES": "invites\ninvites @Jonny_Bro#4226", "NOBODY_AUTHOR": "Ви нікого не запросили на сервер!", "NOBODY_MEMBER": "{{member}} нікого не запрошував(а) на сервер!", "CODE": "**{{code}}** ({{uses}} використань) | {{channel}}", diff --git a/languages/uk-UA/general/minecraft.json b/languages/uk-UA/general/minecraft.json index 64e6aaac..e1d26143 100644 --- a/languages/uk-UA/general/minecraft.json +++ b/languages/uk-UA/general/minecraft.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати інформацію про Minecraft сервер!", - "USAGE": "{{prefix}}minecraft [IP]", - "EXAMPLES": "{{prefix}}minecraft mc.hypixel.net", + "USAGE": "minecraft [IP]", + "EXAMPLES": "minecraft mc.hypixel.net", "MISSING_IP": "Вкажіть IP сервера!", "FAILED": "Сервер недоступний або доступ заборонено!", "ONLINE": "Онлайн", diff --git a/languages/uk-UA/general/permissions.json b/languages/uk-UA/general/permissions.json index 9f268a37..1e416393 100644 --- a/languages/uk-UA/general/permissions.json +++ b/languages/uk-UA/general/permissions.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показати права користувача", - "USAGE": "{{prefix}}permissions (@користувач)", - "EXAMPLES": "{{prefix}}permissions\n{{prefix}}permissions @Jonny_Bro#4226", + "USAGE": "permissions (@користувач)", + "EXAMPLES": "permissions\npermissions @Jonny_Bro#4226", "TITLE": "{{user}} у каналі {{channel}}" } \ No newline at end of file diff --git a/languages/uk-UA/general/ping.json b/languages/uk-UA/general/ping.json index 6d78615a..1f16ea9b 100644 --- a/languages/uk-UA/general/ping.json +++ b/languages/uk-UA/general/ping.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показати пінг бота", - "USAGE": "{{prefix}}ping", - "EXAMPLES": "{{prefix}}ping", + "USAGE": "ping", + "EXAMPLES": "ping", "CONTENT": "Понг! Мій пінг - **{{ping}}**ms." } \ No newline at end of file diff --git a/languages/uk-UA/general/quote.json b/languages/uk-UA/general/quote.json index cfd6bbac..370e7dea 100644 --- a/languages/uk-UA/general/quote.json +++ b/languages/uk-UA/general/quote.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Процитувати повідомлення в канал!", - "USAGE": "{{prefix}}quote [ID-повідомлення] (канал)", - "EXAMPLES": "{{prefix}}quote 596018101921906698\n{{prefix}}quote 596018101921906698 573508780520898581\n{{prefix}}quote 5960", + "USAGE": "quote [ID-повідомлення] (канал)", + "EXAMPLES": "quote 596018101921906698\nquote 596018101921906698 573508780520898581\nquote 5960", "NO_MESSAGE_ID": "Немає повідомлень з цим ID.", "NO_CHANNEL_ID": "Немає каналу з ID або назвою.", "MISSING_ID": "Вкажіть ID повідомлення!" diff --git a/languages/uk-UA/general/remindme.json b/languages/uk-UA/general/remindme.json index e4611b40..8d0c324f 100644 --- a/languages/uk-UA/general/remindme.json +++ b/languages/uk-UA/general/remindme.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Створити нагадування", - "USAGE": "{{prefix}}remindme [час] [повідомлення]", - "EXAMPLES": "{{prefix}}remindme 24h Використати команду work\n{{prefix}}remindme 3m Дістати курку з морозилки!", + "USAGE": "remindme [час] [повідомлення]", + "EXAMPLES": "remindme 24h Використати команду work\nremindme 3m Дістати курку з морозилки!", "MISSING_MESSAGE": "Введіть повідомлення!", "SAVED": "Нагадування збережено!", "TITLE": "Нагадування від JaBa", diff --git a/languages/uk-UA/general/report.json b/languages/uk-UA/general/report.json index 316818fa..76712939 100644 --- a/languages/uk-UA/general/report.json +++ b/languages/uk-UA/general/report.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Надіслати скаргу до спеціального каналу!", - "USAGE": "{{prefix}}report [@користувач] (причина)", - "EXAMPLES": "{{prefix}}report @Jonny_Bro#4226 Порушення правил", + "USAGE": "report [@користувач] (причина)", + "EXAMPLES": "report @Jonny_Bro#4226 Порушення правил", "MISSING_CHANNEL": "Канал для скарг не налаштований!", "MISSING_REASON": "Введіть причину!", "MISSING_USER": "Ви повинні згадати користувача!", diff --git a/languages/uk-UA/general/serverinfo.json b/languages/uk-UA/general/serverinfo.json index 3be67215..1c750a61 100644 --- a/languages/uk-UA/general/serverinfo.json +++ b/languages/uk-UA/general/serverinfo.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати інформацію про сервер!", - "USAGE": "{{prefix}}serverinfo [ID/назва]", - "EXAMPLES": "{{prefix}}serverinfo кик\n{{prefix}}serverinfo", + "USAGE": "serverinfo [ID/назва]", + "EXAMPLES": "serverinfo кик\nserverinfo", "AFK_CHANNEL": "AFK канал", "NO_AFK_CHANNEL": "Немає AFK каналу", "BOOSTS": "К-сть бустів", diff --git a/languages/uk-UA/general/setafk.json b/languages/uk-UA/general/setafk.json index b5968f6b..08b8879b 100644 --- a/languages/uk-UA/general/setafk.json +++ b/languages/uk-UA/general/setafk.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Встановити AFK статус (користувач, який згадає вас отримає повідомлення)", - "USAGE": "{{prefix}}setafk [причина/delete]", - "EXAMPLES": "{{prefix}}setafk Сру =)", + "USAGE": "setafk [причина/delete]", + "EXAMPLES": "setafk Сру =)", "MISSING_REASON": "Вкажіть причину AFK! (не більше 250 символів)", - "SUCCESS": "Тепер ви AFK через: **{{reason}}**\nНапишіть {{prefix}}afk delete, щоб примусово вимкнути AFK", + "SUCCESS": "Тепер ви AFK через: **{{reason}}**\nНапишіть afk delete, щоб примусово вимкнути AFK", "DELETED": "**{{username}}**, AFK статус видалено!", "IS_AFK": "**{{user}}** зараз AFK, причина:\n**`{{reason}}`**" } \ No newline at end of file diff --git a/languages/uk-UA/general/shorturl.json b/languages/uk-UA/general/shorturl.json index 7be64cad..b7533469 100644 --- a/languages/uk-UA/general/shorturl.json +++ b/languages/uk-UA/general/shorturl.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Укоротити посилання!", - "USAGE": "{{prefix}}shorturl [URL]", - "EXAMPLES": "{{prefix}}shorturl https://google.com", + "USAGE": "shorturl [URL]", + "EXAMPLES": "shorturl https://google.com", "MISSING_URL": "Введіть посилання!" } \ No newline at end of file diff --git a/languages/uk-UA/general/staff.json b/languages/uk-UA/general/staff.json index 2557e7c3..8a7f4cfe 100644 --- a/languages/uk-UA/general/staff.json +++ b/languages/uk-UA/general/staff.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати список адміністрації сервера!", - "USAGE": "{{prefix}}staff", - "EXAMPLES": "{{prefix}}staff", + "USAGE": "staff", + "EXAMPLES": "staff", "TITLE": "Персонал {{guild}}", "ADMINS": "Адміністратори", "NO_ADMINS": "Немає адміністраторів", diff --git a/languages/uk-UA/general/stats.json b/languages/uk-UA/general/stats.json index c41ce08b..ac1adafd 100644 --- a/languages/uk-UA/general/stats.json +++ b/languages/uk-UA/general/stats.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати статистику бота!", - "USAGE": "{{prefix}}stats", - "EXAMPLES": "{{prefix}}stats", + "USAGE": "stats", + "EXAMPLES": "stats", "COUNTS_TITLE": "• __Статистика__", "COUNTS_CONTENT": "`Сервера: {{servers}}`\n`Користувачі: {{users}}`", "VERSIONS_TITLE": "• __Використовує__", diff --git a/languages/uk-UA/general/suggest.json b/languages/uk-UA/general/suggest.json index 95e31114..7c290fad 100644 --- a/languages/uk-UA/general/suggest.json +++ b/languages/uk-UA/general/suggest.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Надіслати пропозицію до спеціального каналу!", - "USAGE": "{{prefix}}suggest [пропозиція]", - "EXAMPLES": "{{prefix}}suggest Новий канал #nsfw :smiling_imp:", + "USAGE": "suggest [пропозиція]", + "EXAMPLES": "suggest Новий канал #nsfw :smiling_imp:", "MISSING_CHANNEL": "Канал для пропозицій не налаштований!", "MISSING_CONTENT": "Введіть пропозицію!", "TITLE": "Пропозиція - {{user}}", diff --git a/languages/uk-UA/general/translate.json b/languages/uk-UA/general/translate.json index 17a20ee9..581fb21f 100644 --- a/languages/uk-UA/general/translate.json +++ b/languages/uk-UA/general/translate.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Перекласти текст!", - "USAGE": "{{prefix}}translate [мова] [текст]", - "EXAMPLES": "{{prefix}}translate english Як справи?", + "USAGE": "translate [мова] [текст]", + "EXAMPLES": "translate english Як справи?", "LIST_SENT": "Список мов надісланий вам до ОП!", - "MISSING_LANGUAGE": "Вкажіть мову! Щоб отримати список мов, введіть `{{prefix}}translate langs-list`!", - "INVALID_LANGUAGE": "Мова `{{search}}` не знайдена! Щоб отримати список мов, введіть `{{prefix}}translate langs-list`!", + "MISSING_LANGUAGE": "Вкажіть мову! Щоб отримати список мов, введіть `translate langs-list`!", + "INVALID_LANGUAGE": "Мова `{{search}}` не знайдена! Щоб отримати список мов, введіть `translate langs-list`!", "MISSING_CONTENT": "Введіть текст!" } \ No newline at end of file diff --git a/languages/uk-UA/general/userinfo.json b/languages/uk-UA/general/userinfo.json index 5f2f5c45..2206b62f 100644 --- a/languages/uk-UA/general/userinfo.json +++ b/languages/uk-UA/general/userinfo.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати інформацію про користувача!", - "USAGE": "{{prefix}}userinfo (@user/ID)", - "EXAMPLES": "{{prefix}}userinfo\n{{prefix}}userinfo @Jonny_Bro#4226\n{{prefix}}userinfo 281361531411890186", + "USAGE": "userinfo (@user/ID)", + "EXAMPLES": "userinfo\nuserinfo @Jonny_Bro#4226\nuserinfo 281361531411890186", "INVALID_USER": "Користувач з ID `{{search}}` не знайдено!", "NO_GAME": "Не грає", "NO_ROLE": "Немає ролі", diff --git a/languages/uk-UA/general/whois.json b/languages/uk-UA/general/whois.json index c0bdbeab..1240cfbe 100644 --- a/languages/uk-UA/general/whois.json +++ b/languages/uk-UA/general/whois.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отримати інформацію про IP адресу!", - "USAGE": "{{prefix}}whois (IP)", - "EXAMPLES": "{{prefix}}whois 1.1.1.1", + "USAGE": "whois (IP)", + "EXAMPLES": "whois 1.1.1.1", "NO_IP": "Вкажіть IP адресу!", "ERROR": "Відбулася помилка при отриманні даних про {{ip}}", "INFO_ABOUT": "Інформація про {{ip}}", diff --git a/languages/uk-UA/images/approved.json b/languages/uk-UA/images/approved.json index 24ee1eb6..caa15db5 100644 --- a/languages/uk-UA/images/approved.json +++ b/languages/uk-UA/images/approved.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"approved\"", - "USAGE": "{{prefix}}approved (@користувач)", - "EXAMPLES": "{{prefix}}approved\n{{prefix}}approved @Jonny_Bro#4226" + "USAGE": "approved (@користувач)", + "EXAMPLES": "approved\napproved @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/avatar.json b/languages/uk-UA/images/avatar.json index b0b7bd39..6b656002 100644 --- a/languages/uk-UA/images/avatar.json +++ b/languages/uk-UA/images/avatar.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Повертає аватар користувача", - "USAGE": "{{prefix}}avatar (@користувач) (link)", - "EXAMPLES": "{{prefix}}avatar\n{{prefix}}avatar @Jonny_Bro#4226\n{{prefix}}avatar link" + "USAGE": "avatar (@користувач) (link)", + "EXAMPLES": "avatar\navatar @Jonny_Bro#4226\navatar link" } \ No newline at end of file diff --git a/languages/uk-UA/images/batslap.json b/languages/uk-UA/images/batslap.json index 6bd7f8fd..a6017abb 100644 --- a/languages/uk-UA/images/batslap.json +++ b/languages/uk-UA/images/batslap.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"batslap\"", - "USAGE": "{{prefix}}batslap (@користувач1) (@користувач2)", - "EXAMPLES": "{{prefix}}batslap\n{{prefix}}batslap @Jonny_Bro#4226 @JaBa#9042" + "USAGE": "batslap (@користувач1) (@користувач2)", + "EXAMPLES": "batslap\nbatslap @Jonny_Bro#4226 @JaBa#9042" } \ No newline at end of file diff --git a/languages/uk-UA/images/beautiful.json b/languages/uk-UA/images/beautiful.json index 98ca2bad..ea26b7ca 100644 --- a/languages/uk-UA/images/beautiful.json +++ b/languages/uk-UA/images/beautiful.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"beautiful\"", - "USAGE": "{{prefix}}beautiful (@користувач)", - "EXAMPLES": "{{prefix}}beautiful\n{{prefix}}beautiful @Jonny_Bro#4226" + "USAGE": "beautiful (@користувач)", + "EXAMPLES": "beautiful\nbeautiful @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/bed.json b/languages/uk-UA/images/bed.json index 301cac4b..791d303f 100644 --- a/languages/uk-UA/images/bed.json +++ b/languages/uk-UA/images/bed.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"bed\"", - "USAGE": "{{prefix}}bed (@користувач1) (@користувач2)", - "EXAMPLES": "{{prefix}}bed @Jonny_Bro#4226\n{{prefix}}bed @Jonny_Bro#4226 @Dkflbvbh k.hyfqc#9402" + "USAGE": "bed (@користувач1) (@користувач2)", + "EXAMPLES": "bed @Jonny_Bro#4226\nbed @Jonny_Bro#4226 @Dkflbvbh k.hyfqc#9402" } \ No newline at end of file diff --git a/languages/uk-UA/images/brazzers.json b/languages/uk-UA/images/brazzers.json index f4beb28a..d43a3b2f 100644 --- a/languages/uk-UA/images/brazzers.json +++ b/languages/uk-UA/images/brazzers.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"brazzers\"", - "USAGE": "{{prefix}}brazzers (@користувач)", - "EXAMPLES": "{{prefix}}brazzers\n{{prefix}}brazzers @Jonny_Bro#4226" + "USAGE": "brazzers (@користувач)", + "EXAMPLES": "brazzers\nbrazzers @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/burn.json b/languages/uk-UA/images/burn.json index f42d02bc..1dbc6604 100644 --- a/languages/uk-UA/images/burn.json +++ b/languages/uk-UA/images/burn.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"burn\"", - "USAGE": "{{prefix}}burn (@користувач)", - "EXAMPLES": "{{prefix}}burn\n{{prefix}}burn @Jonny_Bro#4226" + "USAGE": "burn (@користувач)", + "EXAMPLES": "burn\nburn @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/captcha.json b/languages/uk-UA/images/captcha.json index d48812e8..62acade4 100644 --- a/languages/uk-UA/images/captcha.json +++ b/languages/uk-UA/images/captcha.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"captcha\"", - "USAGE": "{{prefix}}captcha (@користувач)", - "EXAMPLES": "{{prefix}}captcha\n{{prefix}}captcha @Jonny_Bro#4226" + "USAGE": "captcha (@користувач)", + "EXAMPLES": "captcha\ncaptcha @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/challenger.json b/languages/uk-UA/images/challenger.json index f9fd2fd3..a0b627bd 100644 --- a/languages/uk-UA/images/challenger.json +++ b/languages/uk-UA/images/challenger.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"challenger\"", - "USAGE": "{{prefix}}challenger (@користувач)", - "EXAMPLES": "{{prefix}}challenger\n{{prefix}}challenger @Jonny_Bro#4226" + "USAGE": "challenger (@користувач)", + "EXAMPLES": "challenger\nchallenger @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/clyde.json b/languages/uk-UA/images/clyde.json index 463804a1..e7573d47 100644 --- a/languages/uk-UA/images/clyde.json +++ b/languages/uk-UA/images/clyde.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Створити зображення \"Clyde\"", - "USAGE": "{{prefix}}clyde [текст]", - "EXAMPLES": "{{prefix}}clyde Discord закриється 11 грудня 2002 року. Прощайте!.", + "USAGE": "clyde [текст]", + "EXAMPLES": "clyde Discord закриється 11 грудня 2002 року. Прощайте!.", "MISSING_TEXT": "Введіть текст!" } \ No newline at end of file diff --git a/languages/uk-UA/images/crush.json b/languages/uk-UA/images/crush.json index de7c3d0d..73ed728d 100644 --- a/languages/uk-UA/images/crush.json +++ b/languages/uk-UA/images/crush.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"crush\"", - "USAGE": "{{prefix}}crush (@користувач)", - "EXAMPLES": "{{prefix}}crush\n{{prefix}}crush @Jonny_Bro#4226" + "USAGE": "crush (@користувач)", + "EXAMPLES": "crush\ncrush @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/dictator.json b/languages/uk-UA/images/dictator.json index d2486410..cc8db5ac 100644 --- a/languages/uk-UA/images/dictator.json +++ b/languages/uk-UA/images/dictator.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"dictator\"", - "USAGE": "{{prefix}}dictator (@користувач)", - "EXAMPLES": "{{prefix}}dictator\n{{prefix}}dictator @Jonny_Bro#4226" + "USAGE": "dictator (@користувач)", + "EXAMPLES": "dictator\ndictator @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/facepalm.json b/languages/uk-UA/images/facepalm.json index 1e8804b8..30ead48e 100644 --- a/languages/uk-UA/images/facepalm.json +++ b/languages/uk-UA/images/facepalm.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"facepalm\"", - "USAGE": "{{prefix}}facepalm (@користувач)", - "EXAMPLES": "{{prefix}}facepalm\n{{prefix}}facepalm @Jonny_Bro#4226" + "USAGE": "facepalm (@користувач)", + "EXAMPLES": "facepalm\nfacepalm @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/fire.json b/languages/uk-UA/images/fire.json index 87fa8e26..0fb84bc3 100644 --- a/languages/uk-UA/images/fire.json +++ b/languages/uk-UA/images/fire.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"fire\"", - "USAGE": "{{prefix}}fire (@користувач)", - "EXAMPLES": "{{prefix}}fire\n{{prefix}}fire @Jonny_Bro#4226" + "USAGE": "fire (@користувач)", + "EXAMPLES": "fire\nfire @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/jail.json b/languages/uk-UA/images/jail.json index 3b44937c..832b7322 100644 --- a/languages/uk-UA/images/jail.json +++ b/languages/uk-UA/images/jail.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"jail\"", - "USAGE": "{{prefix}}jail (@користувач)", - "EXAMPLES": "{{prefix}}jail\n{{prefix}}jail @Jonny_Bro#4226" + "USAGE": "jail (@користувач)", + "EXAMPLES": "jail\njail @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/love.json b/languages/uk-UA/images/love.json index ff10fd54..2274e9dd 100644 --- a/languages/uk-UA/images/love.json +++ b/languages/uk-UA/images/love.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"love\"", - "USAGE": "{{prefix}}love (@користувач1) (@користувач2)", - "EXAMPLES": "{{prefix}}love @Jonny_Bro#4226\n{{prefix}}love @Jonny_Bro#4226 @JaBa#9042" + "USAGE": "love (@користувач1) (@користувач2)", + "EXAMPLES": "love @Jonny_Bro#4226\nlove @Jonny_Bro#4226 @JaBa#9042" } \ No newline at end of file diff --git a/languages/uk-UA/images/magik.json b/languages/uk-UA/images/magik.json index f601419f..ff512e9d 100644 --- a/languages/uk-UA/images/magik.json +++ b/languages/uk-UA/images/magik.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"magik\"", - "USAGE": "{{prefix}}magik (@користувач)", - "EXAMPLES": "{{prefix}}magik\n{{prefix}}magik @Jonny_Bro#4226" + "USAGE": "magik (@користувач)", + "EXAMPLES": "magik\nmagik @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/mission.json b/languages/uk-UA/images/mission.json index 01cffb22..2cbb6ca6 100644 --- a/languages/uk-UA/images/mission.json +++ b/languages/uk-UA/images/mission.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"mission\"", - "USAGE": "{{prefix}}mission (@користувач)", - "EXAMPLES": "{{prefix}}mission\n{{prefix}}mission @Jonny_Bro#4226" + "USAGE": "mission (@користувач)", + "EXAMPLES": "mission\nmission @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/phcomment.json b/languages/uk-UA/images/phcomment.json index 1b0aeec4..997b3736 100644 --- a/languages/uk-UA/images/phcomment.json +++ b/languages/uk-UA/images/phcomment.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Створити зображення \"phcomment\"", - "USAGE": "{{prefix}}phcomment (@користувач) [текст]", - "EXAMPLES": "{{prefix}}phcomment Привіт!\n{{prefix}}phcomment @Jonny_Bro#4226 Привіт!", + "USAGE": "phcomment (@користувач) [текст]", + "EXAMPLES": "phcomment Привіт!\nphcomment @Jonny_Bro#4226 Привіт!", "MISSING_TEXT": "Вкажіть текст!" } \ No newline at end of file diff --git a/languages/uk-UA/images/ps4.json b/languages/uk-UA/images/ps4.json index 689a3e0e..d881362d 100644 --- a/languages/uk-UA/images/ps4.json +++ b/languages/uk-UA/images/ps4.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"ps4\"", - "USAGE": "{{prefix}}ps4 (@користувач)", - "EXAMPLES": "{{prefix}}ps4\n{{prefix}}ps4 @Jonny_Bro#4226" + "USAGE": "ps4 (@користувач)", + "EXAMPLES": "ps4\nps4 @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/qrcode.json b/languages/uk-UA/images/qrcode.json index 9bd76fb3..70fe7fa3 100644 --- a/languages/uk-UA/images/qrcode.json +++ b/languages/uk-UA/images/qrcode.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Створити QR код із тексту", - "USAGE": "{{prefix}}qrcode [текст]", - "EXAMPLES": "{{prefix}}qrcode Hello World!", + "USAGE": "qrcode [текст]", + "EXAMPLES": "qrcode Hello World!", "MISSING_TEXT": "Вкажіть текст!", "SUCCESS": "От ваш QR код!" } \ No newline at end of file diff --git a/languages/uk-UA/images/rip.json b/languages/uk-UA/images/rip.json index e8343b97..e610aac8 100644 --- a/languages/uk-UA/images/rip.json +++ b/languages/uk-UA/images/rip.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"rip\"", - "USAGE": "{{prefix}}rip (@користувач)", - "EXAMPLES": "{{prefix}}rip\n{{prefix}}rip @Jonny_Bro#4226" + "USAGE": "rip (@користувач)", + "EXAMPLES": "rip\nrip @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/scary.json b/languages/uk-UA/images/scary.json index 6e9f73d2..956fc28f 100644 --- a/languages/uk-UA/images/scary.json +++ b/languages/uk-UA/images/scary.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"scary\"", - "USAGE": "{{prefix}}scary (@користувач)", - "EXAMPLES": "{{prefix}}scary\n{{prefix}}scary @Jonny_Bro#4226" + "USAGE": "scary (@користувач)", + "EXAMPLES": "scary\nscary @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/steamcard.json b/languages/uk-UA/images/steamcard.json index c3bb71a5..53dfe105 100644 --- a/languages/uk-UA/images/steamcard.json +++ b/languages/uk-UA/images/steamcard.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"steamcard\"", - "USAGE": "{{prefix}}steamcard [текст] (@користувач)", - "EXAMPLES": "{{prefix}}steamcard Колекційна картка\n{{prefix}}steamcard Картка @Jonny_Bro#4226" + "USAGE": "steamcard [текст] (@користувач)", + "EXAMPLES": "steamcard Колекційна картка\nsteamcard Картка @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/tobecontinued.json b/languages/uk-UA/images/tobecontinued.json index 92d347b7..bac9c48a 100644 --- a/languages/uk-UA/images/tobecontinued.json +++ b/languages/uk-UA/images/tobecontinued.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"tobecontinued\"", - "USAGE": "{{prefix}}tobecontinued (@користувач)", - "EXAMPLES": "{{prefix}}tobecontinued\n{{prefix}}tobecontinued @Jonny_Bro#4226" + "USAGE": "tobecontinued (@користувач)", + "EXAMPLES": "tobecontinued\ntobecontinued @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/trash.json b/languages/uk-UA/images/trash.json index 92ff5d4f..57af51ee 100644 --- a/languages/uk-UA/images/trash.json +++ b/languages/uk-UA/images/trash.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"trash\"", - "USAGE": "{{prefix}}trash (@користувач)", - "EXAMPLES": "{{prefix}}trash\n{{prefix}}trash @Jonny_Bro#4226" + "USAGE": "trash (@користувач)", + "EXAMPLES": "trash\ntrash @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/triggered.json b/languages/uk-UA/images/triggered.json index 2d49ba83..ec37c9df 100644 --- a/languages/uk-UA/images/triggered.json +++ b/languages/uk-UA/images/triggered.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"triggered\"", - "USAGE": "{{prefix}}triggered (@користувач)", - "EXAMPLES": "{{prefix}}triggered\n{{prefix}}triggered @Jonny_Bro#4226" + "USAGE": "triggered (@користувач)", + "EXAMPLES": "triggered\ntriggered @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/wanted.json b/languages/uk-UA/images/wanted.json index 40ecc9e8..10bf93b3 100644 --- a/languages/uk-UA/images/wanted.json +++ b/languages/uk-UA/images/wanted.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"wanted\"", - "USAGE": "{{prefix}}wanted (@користувач)", - "EXAMPLES": "{{prefix}}wanted\n{{prefix}}wanted @Jonny_Bro#4226" + "USAGE": "wanted (@користувач)", + "EXAMPLES": "wanted\nwanted @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/wasted.json b/languages/uk-UA/images/wasted.json index 59b9f7f2..89e8afe3 100644 --- a/languages/uk-UA/images/wasted.json +++ b/languages/uk-UA/images/wasted.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"wasted\"", - "USAGE": "{{prefix}}wasted (@користувач)", - "EXAMPLES": "{{prefix}}wasted\n{{prefix}}wasted @Jonny_Bro#4226" + "USAGE": "wasted (@користувач)", + "EXAMPLES": "wasted\nwasted @Jonny_Bro#4226" } \ No newline at end of file diff --git a/languages/uk-UA/images/youtube-comment.json b/languages/uk-UA/images/youtube-comment.json index 3fc8f946..eb7e93da 100644 --- a/languages/uk-UA/images/youtube-comment.json +++ b/languages/uk-UA/images/youtube-comment.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Створити зображення \"ytcomment\"", - "USAGE": "{{prefix}}ytcomment (@користувач) [текст]", - "EXAMPLES": "{{prefix}}ytcomment Привіт!\n{{prefix}}ytcomment @Jonny_Bro#4226 Привіт!" + "USAGE": "ytcomment (@користувач) [текст]", + "EXAMPLES": "ytcomment Привіт!\nytcomment @Jonny_Bro#4226 Привіт!" } \ No newline at end of file diff --git a/languages/uk-UA/misc.json b/languages/uk-UA/misc.json index 4fb3cb24..5b92dd92 100644 --- a/languages/uk-UA/misc.json +++ b/languages/uk-UA/misc.json @@ -17,7 +17,7 @@ "NO_USER_FOUND_ID": "Користувача з ID `{{id}}` не існує!", "VOTE_DM": "⬆️ Привіт, {{user}}, дякую за голос!\nТвоя нагорода - 50 кредитів (на сервері підтримки)!", "VOTE_LOGS": "⬆️ **{{usertag}}** (`{{userid}}`) проголосував за **JaBa** і отримав **50** кредитів, дякую!\n", - "HELLO_SERVER": "Привіт, **{{username}}**, мій префікс на даному сервері - `{{prefix}}`. Використовуйте `{{prefix}}help`, щоб отримати список команд!", + "HELLO_SERVER": "Привіт, **{{username}}**, мій префікс на даному сервері - ``. Використовуйте `help`, щоб отримати список команд!", "HELLO_DM": "Привіт, тому що ви пишете в ОП, вам не потрібно використовувати префікс.", "GUILD_ONLY": "Цю команду можна використовувати лише на сервері!", "MISSING_BOT_PERMS": "Мені потрібні наступні права для виконання цієї команди: {{list}}", diff --git a/languages/uk-UA/moderation/announcement.json b/languages/uk-UA/moderation/announcement.json index 7a81fefe..ba50c033 100644 --- a/languages/uk-UA/moderation/announcement.json +++ b/languages/uk-UA/moderation/announcement.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Надіслати оголошення до поточного каналу!", - "USAGE": "{{prefix}}announcement [текст]", - "EXAMPLES": "{{prefix}}announcement Новий модератор!", + "USAGE": "announcement [текст]", + "EXAMPLES": "announcement Новий модератор!", "MISSING_TEXT": "Вкажіть текст!", "TOO_LONG": "Текст повинен бути коротшим за 1030 символів!", "MENTION_PROMPT": "Хочете додати згадку до вашого повідомлення?\nНадіслати `так` або `ні`!", diff --git a/languages/uk-UA/moderation/ban.json b/languages/uk-UA/moderation/ban.json index 9ad8e25d..06d7b03d 100644 --- a/languages/uk-UA/moderation/ban.json +++ b/languages/uk-UA/moderation/ban.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Забанити користувача на сервері!", - "USAGE": "{{prefix}}ban [@користувач] (причина)", - "EXAMPLES": "{{prefix}}ban @Jonny_Bro#4226 Спам", + "USAGE": "ban [@користувач] (причина)", + "EXAMPLES": "ban @Jonny_Bro#4226 Спам", "MISSING_MEMBER": "Ви повинні згадати користувача!", "YOURSELF": "Ви не можете забанити себе!", "SUPERIOR": "Ви не можете зробити це, тому що користувач стоїть вище за вас по ролі!", diff --git a/languages/uk-UA/moderation/clear.json b/languages/uk-UA/moderation/clear.json index cc5ab80d..30cdfa5b 100644 --- a/languages/uk-UA/moderation/clear.json +++ b/languages/uk-UA/moderation/clear.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Видалити повідомлення!", - "USAGE": "{{prefix}}clear [у_повідомлень] (@користувач)", - "EXAMPLES": "{{prefix}}clear 10\n{{prefix}}clear 10 @Jonny_Bro#4226\n{{prefix}}clear all", + "USAGE": "clear [у_повідомлень] (@користувач)", + "EXAMPLES": "clear 10\nclear 10 @Jonny_Bro#4226\nclear all", "MISSING_AMOUNT": "Вкажіть кількість повідомлень для видалення!", "ALL_CONFIRM": "Всі повідомлення в каналі будуть видалені! Введіть `confirm` для підтвердження", "CHANNEL_CLEARED": "Канал очищений!", diff --git a/languages/uk-UA/moderation/clearwarns.json b/languages/uk-UA/moderation/clearwarns.json index 40df53e4..d8c48661 100644 --- a/languages/uk-UA/moderation/clearwarns.json +++ b/languages/uk-UA/moderation/clearwarns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Зняти усі попередження з користувача!", - "USAGE": "{{prefix}}clearwarns [@користувач]", - "EXAMPLES": "{{prefix}}clearwarns @Jonny_Bro#4226", + "USAGE": "clearwarns [@користувач]", + "EXAMPLES": "clearwarns @Jonny_Bro#4226", "MISSING_MEMBER": "Ви повинні згадати користувача!", "SUCCESS": "Попередження користувача **{{username}}** видалено!" } \ No newline at end of file diff --git a/languages/uk-UA/moderation/giveaway.json b/languages/uk-UA/moderation/giveaway.json index 0ea627e2..a4805587 100644 --- a/languages/uk-UA/moderation/giveaway.json +++ b/languages/uk-UA/moderation/giveaway.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Керування роздачами!", - "USAGE": "{{prefix}}giveaway [create/reroll/delete/end] [час] [к-сть переможців] (Дроп? true) [приз]", - "EXAMPLES": "{{prefix}}giveaway create 1d 2100 рублів на карту!\n{{prefix}}giveaway create 1d 2 true 100 рублів на карту\n{{prefix}}giveaway reroll 59781289802203137", + "USAGE": "giveaway [create/reroll/delete/end] [час] [к-сть переможців] (Дроп? true) [приз]", + "EXAMPLES": "giveaway create 1d 2100 рублів на карту!\ngiveaway create 1d 2 true 100 рублів на карту\ngiveaway reroll 59781289802203137", "MISSING_STATUS": "Виберіть дію: `create`, `reroll`, `end` або `delete`!", "INVALID_CREATE": "Якийсь із аргументів вказано неправильно, спробуйте знову!", "MISSING_ID": "Вкажіть ID повідомлення роздачі!", diff --git a/languages/uk-UA/moderation/kick.json b/languages/uk-UA/moderation/kick.json index 56d2884f..4ab4406e 100644 --- a/languages/uk-UA/moderation/kick.json +++ b/languages/uk-UA/moderation/kick.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Кікнути користувача!", - "USAGE": "{{prefix}}kick [@користувач] (причина)", - "EXAMPLES": "{{prefix}}kick @Jonny_Bro#4226 Спам", + "USAGE": "kick [@користувач] (причина)", + "EXAMPLES": "kick @Jonny_Bro#4226 Спам", "MISSING_MEMBER": "Ви повинні згадати користувача!", "YOURSELF": "Ви не можете кікнути себе!", "MISSING_PERM": "Сталася помилка... Перевірте, чи є у вас право кікати користувачів і спробуйте знову!", diff --git a/languages/uk-UA/moderation/mute.json b/languages/uk-UA/moderation/mute.json index a90fcdc5..b296e8fc 100644 --- a/languages/uk-UA/moderation/mute.json +++ b/languages/uk-UA/moderation/mute.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Заборонити користувачеві писати повідомлення та входити в голосові канали!", - "USAGE": "{{prefix}}mute [@користувач] [час] (причина)", - "EXAMPLES": "{{prefix}}mute @Jonny_Bro#4226 24h Спам", + "USAGE": "mute [@користувач] [час] (причина)", + "EXAMPLES": "mute @Jonny_Bro#4226 24h Спам", "MISSING_MEMBER": "Ви повинні згадати користувача!", "YOURSELF": "Ви не можете замутить себе!", "MUTED_DM": "Привіт {{username}},\nви були замучені на сервері **{{server}}** користувачем **{{moderator}}** на **{{time}}** через * *{{reason}}**!", diff --git a/languages/uk-UA/moderation/poll.json b/languages/uk-UA/moderation/poll.json index 4eec9f8b..31ea227c 100644 --- a/languages/uk-UA/moderation/poll.json +++ b/languages/uk-UA/moderation/poll.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Створити опитування в поточному каналі!", - "USAGE": "{{prefix}}poll [питання]", - "EXAMPLES": "{{prefix}}poll Земля плоска?", + "USAGE": "poll [питання]", + "EXAMPLES": "poll Земля плоска?", "MISSING_QUESTION": "Введіть питання!", "REACT": "Відреагуйте {{success}} або {{error}}!", "TITLE": "📊 Опитування:" diff --git a/languages/uk-UA/moderation/setwarns.json b/languages/uk-UA/moderation/setwarns.json index 850d2324..1a393b0a 100644 --- a/languages/uk-UA/moderation/setwarns.json +++ b/languages/uk-UA/moderation/setwarns.json @@ -1,12 +1,12 @@ { "DESCRIPTION": "Налаштувати покарання, яке користувач буде отримувати після даної кількості попереджень!", - "USAGE": "{{prefix}}setwarns [kick/ban] [число/reset]", - "EXAMPLES": "{{prefix}}setwarns kick 5\n{{prefix}}setwarns ban 10\n{{prefix}}setwarns ban reset", + "USAGE": "setwarns [kick/ban] [число/reset]", + "EXAMPLES": "setwarns kick 5\nsetwarns ban 10\nsetwarns ban reset", "MISSING_TYPE": "Виберіть дію: `kick` або `ban`!", - "SUCCESS_KICK": "`{{count}}` призведуть до кіку!\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені налаштування!*", - "SUCCESS_BAN": "`{{count}}` приведуть до бана!\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені налаштування!*", - "SUCCESS_KICK_RESET": "**Автокік користувачів вимкнено!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені налаштування!*", - "SUCCESS_BAN_RESET": "**Автобан користувачів вимкнено!**\n\n:arrow_right_hook: *Використовуйте `{{prefix}}configuration`, щоб побачити оновлені налаштування!*", + "SUCCESS_KICK": "`{{count}}` призведуть до кіку!\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", + "SUCCESS_BAN": "`{{count}}` приведуть до бана!\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", + "SUCCESS_KICK_RESET": "**Автокік користувачів вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", + "SUCCESS_BAN_RESET": "**Автобан користувачів вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", "AUTO_BAN": "**{{username}}** був автоматично забанений за досягнення {{count}}!", "AUTO_KICK": "**{{username}}** був автоматично кікнутий за досягнення {{count}}!" } \ No newline at end of file diff --git a/languages/uk-UA/moderation/unban.json b/languages/uk-UA/moderation/unban.json index e07e8161..abcd5ef6 100644 --- a/languages/uk-UA/moderation/unban.json +++ b/languages/uk-UA/moderation/unban.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Розбанити користувача на сервері!", - "USAGE": "{{prefix}}unban [ID]", - "EXAMPLES": "{{prefix}}unban 281361531411890186", + "USAGE": "unban [ID]", + "EXAMPLES": "unban 281361531411890186", "MISSING_ID": "Вкажіть ID користувача!", "NOT_BANNED": "**{{username}}** не забанен!", "UNBANNED": "**{{username}}** був розбанений на сервері **{{server}}**!" diff --git a/languages/uk-UA/moderation/unmute.json b/languages/uk-UA/moderation/unmute.json index f91e8b52..4e735ba6 100644 --- a/languages/uk-UA/moderation/unmute.json +++ b/languages/uk-UA/moderation/unmute.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Розмутити користувача!", - "USAGE": "{{prefix}}unmute [@user]", - "EXAMPLES": "{{prefix}}unmute @Jonny_Bro#4226", + "USAGE": "unmute [@user]", + "EXAMPLES": "unmute @Jonny_Bro#4226", "MISSING_MEMBER": "Ви повинні згадати користувача!", "NOT_MUTED": "**{{username}}** не замучений на даному сервері!", "SUCCESS": "**{{username}}** був розмучений на даному сервері!", diff --git a/languages/uk-UA/moderation/warn.json b/languages/uk-UA/moderation/warn.json index b4b0f634..70f81c9c 100644 --- a/languages/uk-UA/moderation/warn.json +++ b/languages/uk-UA/moderation/warn.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Видати попередження користувачеві в ОП", - "USAGE": "{{prefix}}warn [@користувач] (причина)", - "EXAMPLES": "{{prefix}}warn @Jonny_Bro#4226 stupid", + "USAGE": "warn [@користувач] (причина)", + "EXAMPLES": "warn @Jonny_Bro#4226 stupid", "MISSING_MEMBER": "Ви повинні згадати користувача!", "YOURSELF": "Ви не можете подати скаргу на себе!", "MISSING_REASON": "Вкажіть причину!", diff --git a/languages/uk-UA/moderation/warns.json b/languages/uk-UA/moderation/warns.json index a840961e..b971f9b6 100644 --- a/languages/uk-UA/moderation/warns.json +++ b/languages/uk-UA/moderation/warns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати список порушень користувача!", - "USAGE": "{{prefix}}sanctions [@користувач]", - "EXAMPLES": "{{prefix}}sanctions @Jonny_Bro#4226", + "USAGE": "sanctions [@користувач]", + "EXAMPLES": "sanctions @Jonny_Bro#4226", "MISSING_MEMBER": "Ви повинні згадати користувача!", "NO_SANCTION": "**{{username}}** не має порушень." } \ No newline at end of file diff --git a/languages/uk-UA/music/autoplay.json b/languages/uk-UA/music/autoplay.json index 7be53cf0..5a04d2b2 100644 --- a/languages/uk-UA/music/autoplay.json +++ b/languages/uk-UA/music/autoplay.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Увімкнути або вимкнути автовідтворення", - "USAGE": "{{prefix}}autoplay", - "EXAMPLES": "{{prefix}}autoplay", + "USAGE": "autoplay", + "EXAMPLES": "autoplay", "SUCCESS_ENABLED": "Автовідтворення увімкнено!", "SUCCESS_DISABLED": "Автовідтворення вимкнено!" } \ No newline at end of file diff --git a/languages/uk-UA/music/back.json b/languages/uk-UA/music/back.json index 12979331..f0ae9e25 100644 --- a/languages/uk-UA/music/back.json +++ b/languages/uk-UA/music/back.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Увімкнути попередній трек", - "USAGE": "{{prefix}}back", - "EXAMPLES": "{{prefix}}back", + "USAGE": "back", + "EXAMPLES": "back", "NO_PREV_SONG": "Попередній трек відсутній!", "SUCCESS": "Грає попередній трек!" } \ No newline at end of file diff --git a/languages/uk-UA/music/clip.json b/languages/uk-UA/music/clip.json index ac3082d2..7a428917 100644 --- a/languages/uk-UA/music/clip.json +++ b/languages/uk-UA/music/clip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Відтворити кліп", - "USAGE": "{{prefix}}clip [назва-файлу]", - "EXAMPLES": "{{prefix}}clip haha", + "USAGE": "clip [назва-файлу]", + "EXAMPLES": "clip haha", "NO_ARG": "Вкажіть назву файлу!", "NO_FILE": "Файл {{file}} відсутній!", "ACTIVE_QUEUE": "Не можу відтворити кліп, тому що на сервері є активна черга!", diff --git a/languages/uk-UA/music/clips.json b/languages/uk-UA/music/clips.json index dc139a5b..d17fe518 100644 --- a/languages/uk-UA/music/clips.json +++ b/languages/uk-UA/music/clips.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Показати список доступних звуків", - "USAGE": "{{prefix}}clips", - "EXAMPLES": "{{prefix}}clips", + "USAGE": "clips", + "EXAMPLES": "clips", "EMBED_TITLE": "**Список кліпів**" } \ No newline at end of file diff --git a/languages/uk-UA/music/filter.json b/languages/uk-UA/music/filter.json index b5843591..36638a28 100644 --- a/languages/uk-UA/music/filter.json +++ b/languages/uk-UA/music/filter.json @@ -1,9 +1,9 @@ { "DESCRIPTION": "Увімкнути або вимкнути фільтр музики", - "USAGE": "{{prefix}}filter [фільтр]", - "EXAMPLES": "{{prefix}}filter vaporwave", - "MISSING_FILTER": "Вкажіть фільтр для його включення! (або надішліть `{{prefix}}filters`, щоб побачити статуси фільтрів)", - "UNKNOWN_FILTER": "Заданий фільтр не існує! Використовуйте `{{prefix}}filters` щоб побачити список фільтрів або `{{prefix}}filter off` щоб вимкнути всі фільтри!", + "USAGE": "filter [фільтр]", + "EXAMPLES": "filter vaporwave", + "MISSING_FILTER": "Вкажіть фільтр для його включення! (або надішліть `filters`, щоб побачити статуси фільтрів)", + "UNKNOWN_FILTER": "Заданий фільтр не існує! Використовуйте `filters` щоб побачити список фільтрів або `filter off` щоб вимкнути всі фільтри!", "CHANGING_FILTER": "Обновляю фільтри, зачекайте...", "REMOVING_FILTER": "Відключаю всі фільтри, зачекайте..." } \ No newline at end of file diff --git a/languages/uk-UA/music/filters.json b/languages/uk-UA/music/filters.json index 1c34f29c..dd0310db 100644 --- a/languages/uk-UA/music/filters.json +++ b/languages/uk-UA/music/filters.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отримати список фільтрів та їх статуси", - "USAGE": "{{prefix}}filters", - "EXAMPLES": "{{prefix}}filters", + "USAGE": "filters", + "EXAMPLES": "filters", "TITLE": "**Фільтри**", - "CONTENT": "Ось список усіх наявних фільтрів.\nВикористовуйте `{{prefix}}filter <фільтр>`, щоб змінити статус одного з них." + "CONTENT": "Ось список усіх наявних фільтрів.\nВикористовуйте `filter <фільтр>`, щоб змінити статус одного з них." } \ No newline at end of file diff --git a/languages/uk-UA/music/jump.json b/languages/uk-UA/music/jump.json index 400b7f4e..ec30bdf6 100644 --- a/languages/uk-UA/music/jump.json +++ b/languages/uk-UA/music/jump.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Перейти на заданий трек", - "USAGE": "{{prefix}}jump [номер]", - "EXAMPLES": "{{prefix}}jump 3", - "NO_PREV_SONG": "Ви не можете перейти назад, використовуйте команду `{{prefix}}back`!", + "USAGE": "jump [номер]", + "EXAMPLES": "jump 3", + "NO_PREV_SONG": "Ви не можете перейти назад, використовуйте команду `back`!", "SUCCESS": "Грає вибраний трек!" } \ No newline at end of file diff --git a/languages/uk-UA/music/loop.json b/languages/uk-UA/music/loop.json index 7d9d60de..3844a590 100644 --- a/languages/uk-UA/music/loop.json +++ b/languages/uk-UA/music/loop.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Увімкнути або вимкнути повтор черги/одного треку!", - "USAGE": "{{prefix}}loop (queue/all/song/single)", - "EXAMPLES": "{{prefix}}loop queue\n{{prefix}}loop single", + "USAGE": "loop (queue/all/song/single)", + "EXAMPLES": "loop queue\nloop single", "QUEUE": "Повтор черги **включено**!", "SONG": "Повтор поточного треку **включено**!", "DISABLED": "Повтор **відключено**!" diff --git a/languages/uk-UA/music/lyrics.json b/languages/uk-UA/music/lyrics.json index 7df22951..0f8e8031 100644 --- a/languages/uk-UA/music/lyrics.json +++ b/languages/uk-UA/music/lyrics.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Знайти текст пісні", - "USAGE": "{{prefix}}lyrics [назва-пісні]", - "EXAMPLES": "{{prefix}}lyrics Skyfall", + "USAGE": "lyrics [назва-пісні]", + "EXAMPLES": "lyrics Skyfall", "LYRICS_OF": "🎤 Текст {{songName}}", "AND_MORE": "\n**і т.д...**", "CLICK_HERE": "Натисніть сюди, щоб відкрити посилання на слова до цієї пісні", diff --git a/languages/uk-UA/music/np.json b/languages/uk-UA/music/np.json index ded84e23..fbb5551f 100644 --- a/languages/uk-UA/music/np.json +++ b/languages/uk-UA/music/np.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати інформацію про трек, що грає зараз!", - "USAGE": "{{prefix}}np", - "EXAMPLES": "{{prefix}}np", + "USAGE": "np", + "EXAMPLES": "np", "CURRENTLY_PLAYING": "Зараз грає", "T_TITLE": "Назва", "T_CHANNEL": "Канал", diff --git a/languages/uk-UA/music/pause.json b/languages/uk-UA/music/pause.json index edbb49c5..1fd64b9d 100644 --- a/languages/uk-UA/music/pause.json +++ b/languages/uk-UA/music/pause.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Поставити відтворення черги на паузу!", - "USAGE": "{{prefix}}pause", - "EXAMPLES": "{{prefix}}pause", + "USAGE": "pause", + "EXAMPLES": "pause", "SUCCESS": "⏸️ Відтворення черги призупинено." } \ No newline at end of file diff --git a/languages/uk-UA/music/play.json b/languages/uk-UA/music/play.json index 0aee5dab..a3160468 100644 --- a/languages/uk-UA/music/play.json +++ b/languages/uk-UA/music/play.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Почати відтворення треку!", - "USAGE": "{{prefix}}play [назва-трека/посилання]", - "EXAMPLES": "{{prefix}}play Never Gonna Give You Up", + "USAGE": "play [назва-трека/посилання]", + "EXAMPLES": "play Never Gonna Give You Up", "NO_VOICE_CHANNEL": "Ви повинні знаходитися в голосовому каналі!", "VOICE_CHANNEL_CONNECT": "Я не можу приєднатися до вашого голосового каналу!", "MISSING_SONG_NAME": "Вкажіть назву треку або посилання на нього!", diff --git a/languages/uk-UA/music/queue.json b/languages/uk-UA/music/queue.json index 6c8e6178..9a23cf22 100644 --- a/languages/uk-UA/music/queue.json +++ b/languages/uk-UA/music/queue.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показати чергу на відтворення", - "USAGE": "{{prefix}}queue", - "EXAMPLES": "{{prefix}}queue", + "USAGE": "queue", + "EXAMPLES": "queue", "TITLE": "Черга", "ADDED": "Додав" } \ No newline at end of file diff --git a/languages/uk-UA/music/resume.json b/languages/uk-UA/music/resume.json index 62fe263b..e2696e6d 100644 --- a/languages/uk-UA/music/resume.json +++ b/languages/uk-UA/music/resume.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Продовжує відтворення черги!", - "USAGE": "{{prefix}}resume", - "EXAMPLES": "{{prefix}}resume", + "USAGE": "resume", + "EXAMPLES": "resume", "SUCCESS": "▶️ Відтворення черги продовжується!" } \ No newline at end of file diff --git a/languages/uk-UA/music/seek.json b/languages/uk-UA/music/seek.json index 33ac118c..fa38358e 100644 --- a/languages/uk-UA/music/seek.json +++ b/languages/uk-UA/music/seek.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Перемотати вперед або назад у поточному треку!", - "USAGE": "{{prefix}}seek [час]", - "EXAMPLES": "{{prefix}}seek 10s\n{{prefix}}seek -10s", + "USAGE": "seek [час]", + "EXAMPLES": "seek 10s\nseek -10s", "INVALID_TIME": "Вкажіть час!", "SUCCESS": "▶️ Трек перемотаний!" } \ No newline at end of file diff --git a/languages/uk-UA/music/skip.json b/languages/uk-UA/music/skip.json index 44575855..ad74cd60 100644 --- a/languages/uk-UA/music/skip.json +++ b/languages/uk-UA/music/skip.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Пропустити поточний трек", - "USAGE": "{{prefix}}skip", - "EXAMPLES": "{{prefix}}skip", + "USAGE": "skip", + "EXAMPLES": "skip", "NO_NEXT_SONG": "Черга порожня!", "SUCCESS": "Трек пропущено!" } \ No newline at end of file diff --git a/languages/uk-UA/music/stop.json b/languages/uk-UA/music/stop.json index 6797ea4c..baa1496b 100644 --- a/languages/uk-UA/music/stop.json +++ b/languages/uk-UA/music/stop.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Зупинити відтворення черги", - "USAGE": "{{prefix}}stop", - "EXAMPLES": "{{prefix}}stop", + "USAGE": "stop", + "EXAMPLES": "stop", "SUCCESS": "Відтворення зупинено!" } \ No newline at end of file diff --git a/languages/uk-UA/nsfw/nsfw.json b/languages/uk-UA/nsfw/nsfw.json index f249e300..de9ff969 100644 --- a/languages/uk-UA/nsfw/nsfw.json +++ b/languages/uk-UA/nsfw/nsfw.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Отримати NSFW зображення з вибраного або випадкового сабреддита", - "USAGE": "{{prefix}}nsfw (тег/list)", - "EXAMPLES": "{{prefix}}nsfw\n{{prefix}}nsfw list", + "USAGE": "nsfw (тег/list)", + "EXAMPLES": "nsfw\nnsfw list", "SEARCHING": "Шукаю зображення за тегом `{{tag}}`", "SEARCHING_RANDOM": "Шукаю випадкове зображення", "EMBED_TITLE": "Доступні категорії", diff --git a/languages/uk-UA/owner/debug.json b/languages/uk-UA/owner/debug.json index 2be43977..6486f2f1 100644 --- a/languages/uk-UA/owner/debug.json +++ b/languages/uk-UA/owner/debug.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Дозволяє змінювати багато даних користувача!", - "USAGE": "{{prefix}}debug [set/add] [level/xp/credits/bank/rep] [@користувач] [значення]", - "EXAMPLES": "{{prefix}}debug set level @Jonny_Bro#4226 10000", + "USAGE": "debug [set/add] [level/xp/credits/bank/rep] [@користувач] [значення]", + "EXAMPLES": "debug set level @Jonny_Bro#4226 10000", "INVALID_MEMBER": "Ви повинні згадати користувача!", "NO_ACTION": "Виберіть дію: `set` або `add`!", "NO_STATUS": "Виберіть параметр: `level`, `xp`, `credits`, `rep` або `bank`!", diff --git a/languages/uk-UA/owner/eval.json b/languages/uk-UA/owner/eval.json index e0446023..9e8eeec8 100644 --- a/languages/uk-UA/owner/eval.json +++ b/languages/uk-UA/owner/eval.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Виконати код!", - "USAGE": "{{prefix}}eval [код]", - "EXAMPLES": "{{prefix}}eval message.channel.send({ content: \"Hello World!\" })" + "USAGE": "eval [код]", + "EXAMPLES": "eval message.channel.send({ content: \"Hello World!\" })" } \ No newline at end of file diff --git a/languages/uk-UA/owner/reload.json b/languages/uk-UA/owner/reload.json index 39636f15..1e29d106 100644 --- a/languages/uk-UA/owner/reload.json +++ b/languages/uk-UA/owner/reload.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Перезавантажити команду!", - "USAGE": "{{prefix}}reload", - "EXAMPLES": "{{prefix}}reload help", + "USAGE": "reload", + "EXAMPLES": "reload help", "NOT_FOUND": "Команда `{{search}}` не існує!", "SUCCESS": "Команда `{{command}}` успішно перезавантажена!" } \ No newline at end of file diff --git a/languages/uk-UA/owner/say.json b/languages/uk-UA/owner/say.json index 37b3f469..d3bc2e8d 100644 --- a/languages/uk-UA/owner/say.json +++ b/languages/uk-UA/owner/say.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Написати повідомлення від імені бота!", - "USAGE": "{{prefix}}say [текст] ++ (ID/назва-каналу) ++ (ID/назва-сервера)", - "EXAMPLES": "{{prefix}}say Слава Україні!\n{{prefix}}say Слава Україні! ++ 123456789098765432" + "USAGE": "say [текст] ++ (ID/назва-каналу) ++ (ID/назва-сервера)", + "EXAMPLES": "say Слава Україні!\nsay Слава Україні! ++ 123456789098765432" } \ No newline at end of file diff --git a/languages/uk-UA/owner/servers-list.json b/languages/uk-UA/owner/servers-list.json index f6d023dd..c056be60 100644 --- a/languages/uk-UA/owner/servers-list.json +++ b/languages/uk-UA/owner/servers-list.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Показати список серверів бота!", - "USAGE": "{{prefix}}servers-list", - "EXAMPLES": "{{prefix}}servers-list" + "USAGE": "servers-list", + "EXAMPLES": "servers-list" } \ No newline at end of file From 73a2834109a9c73331d21d94ceee68604c07b02e Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Tue, 26 Jul 2022 17:20:10 +0500 Subject: [PATCH 04/16] =?UTF-8?q?=D0=9C=D0=BD=D0=BE=D0=B3=D0=BE=20=D1=84?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=BE=D0=B2=20=D0=B8=20=D1=83=D0=B4=D0=B0?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B9=20=D1=81=D1=82=D0=B0=D1=80=D0=BE?= =?UTF-8?q?=D0=B3=D0=BE,=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5=D0=B3=D0=BE=20?= =?UTF-8?q?=D0=B8=D0=BB=D0=B8=20=D0=BD=D0=B5=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D0=BE=D0=B3=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- base/BaseCommand.js | 10 +++ base/JaBa.js | 13 +-- commands/Examples/mention.js | 9 +- commands/Examples/ping.js | 9 +- commands/Examples/repeat.js | 9 +- commands/Owner/eval.js | 1 + config.sample.js | 2 +- dashboard/app.js | 2 +- emojis.json | 1 - events/CommandHandler.js | 4 +- events/{ => Guild}/guildCreate.js | 2 +- events/{ => Guild}/guildDelete.js | 2 +- events/{ => Guild}/guildMemberAdd.js | 2 +- events/{ => Guild}/guildMemberRemove.js | 2 +- events/{ => Guild}/guildMemberUpdate.js | 2 +- events/messageCreate.js | 4 +- events/ready.js | 4 +- helpers/autoUpdateDocs.js | 84 +++++++++---------- helpers/birthdays.js | 6 +- helpers/checkReminds.js | 83 +++++++++---------- helpers/checkUnmutes.js | 106 +++++++++++------------- helpers/clearTransactions.js | 29 ++++--- helpers/discordTogether.js | 8 +- helpers/extenders.js | 69 +++++++-------- helpers/functions.js | 71 +--------------- helpers/logger.js | 4 +- helpers/tictactoe.js | 21 +++-- index.js | 4 +- languages/en-US/general/invite.json | 1 - languages/en-US/general/suggest.json | 3 +- languages/en-US/general/userinfo.json | 3 +- languages/en-US/misc.json | 2 - languages/en-US/music/stop.json | 1 - languages/ru-RU/general/invite.json | 1 - languages/ru-RU/general/userinfo.json | 3 +- languages/ru-RU/misc.json | 2 - languages/uk-UA/general/invite.json | 1 - languages/uk-UA/general/userinfo.json | 3 +- languages/uk-UA/misc.json | 2 - scripts/verify-config.js | 46 ++++------ 40 files changed, 259 insertions(+), 372 deletions(-) rename events/{ => Guild}/guildCreate.js (97%) rename events/{ => Guild}/guildDelete.js (92%) rename events/{ => Guild}/guildMemberAdd.js (99%) rename events/{ => Guild}/guildMemberRemove.js (99%) rename events/{ => Guild}/guildMemberUpdate.js (95%) diff --git a/base/BaseCommand.js b/base/BaseCommand.js index 90b2b560..e60989b9 100644 --- a/base/BaseCommand.js +++ b/base/BaseCommand.js @@ -1,4 +1,6 @@ /* eslint-disable no-unused-vars */ +const path = require("path"); + class BaseCommand { constructor(options, client) { /** @@ -17,6 +19,14 @@ class BaseCommand { * @type {Boolean} */ this.ownerOnly = options.ownerOnly || false; + /** + * @type {Object} + */ + this.dirname = options.dirname || false; + /** + * @type {String} + */ + this.category = (this.dirname ? this.dirname.split(path.sep)[parseInt(this.dirname.split(path.sep).length - 1, 10)] : "Other"); } } diff --git a/base/JaBa.js b/base/JaBa.js index 3782a482..00927e07 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -124,8 +124,6 @@ class JaBa extends Client { * @returns */ async loadCommands(dir, guild_id) { - if (!this.translations) this.translations = await require("../helpers/languages")(); - const filePath = path.join(__dirname, dir); const files = await fs.readdir(filePath); const rest = new REST({ version: "9" }).setToken(this.config.token); @@ -215,11 +213,8 @@ class JaBa extends Client { this.logger.log(`Unable to connect to the Mongodb database. Error: ${err}`, "error"); }); - // const languages = require("../helpers/languages"); - // this.translations = await languages(); - - // const autoUpdateDocs = require("../helpers/autoUpdateDocs"); - // autoUpdateDocs.update(this); + const autoUpdateDocs = require("../helpers/autoUpdateDocs"); + autoUpdateDocs.update(this); } get defaultLanguage() { @@ -251,12 +246,12 @@ class JaBa extends Client { } convertTime(time, type, noPrefix, locale) { - if (!type) time = "to"; + if (!type) type = false; if (!locale) locale = this.defaultLanguage; const languageData = this.languages.find((language) => language.name === locale || language.aliases.includes(locale)); const m = moment(time).locale(languageData.moment); - return (type === "to" ? m.toNow(noPrefix) : m.fromNow(noPrefix)); + return (type ? m.toNow(noPrefix) : m.fromNow(noPrefix)); } getNoun(number, one, two, five) { diff --git a/commands/Examples/mention.js b/commands/Examples/mention.js index 0c1923b4..af0fe6bf 100644 --- a/commands/Examples/mention.js +++ b/commands/Examples/mention.js @@ -1,9 +1,9 @@ -const BaseCommand = require("../base/BaseCommand"); +const BaseCommand = require("../../base/BaseCommand"); class Mention extends BaseCommand { /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client */ constructor() { super({ @@ -12,19 +12,20 @@ class Mention extends BaseCommand { type: 2 // Type 2 is USER COMMAND. }, aliases: ["m"], // Application command aliases. + dirname: __dirname, guildOnly: true // Determines whether your command is only guild. }); } /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client */ async onLoad() { //... } /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client * @param {import("discord.js").ContextMenuInteraction} interaction */ async execute(client, interaction) { diff --git a/commands/Examples/ping.js b/commands/Examples/ping.js index 313929cf..945c6fe1 100644 --- a/commands/Examples/ping.js +++ b/commands/Examples/ping.js @@ -1,10 +1,10 @@ const { SlashCommandBuilder } = require("@discordjs/builders"); -const BaseCommand = require("../base/BaseCommand"); +const BaseCommand = require("../../base/BaseCommand"); class Ping extends BaseCommand { /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client */ constructor() { super({ @@ -12,19 +12,20 @@ class Ping extends BaseCommand { .setName("ping") .setDescription("Ping command."), // This option is included in type 1. You can configure this option directly with the SlashCommandBuilder feature. aliases: ["p"], // Application command aliases. + dirname: __dirname, guildOnly: true // Determines whether your command is only guild. }); } /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client */ async onLoad() { //... } /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client * @param {import("discord.js").CommandInteraction} interaction */ async execute(client, interaction) { diff --git a/commands/Examples/repeat.js b/commands/Examples/repeat.js index 4b593b32..b7bae955 100644 --- a/commands/Examples/repeat.js +++ b/commands/Examples/repeat.js @@ -1,9 +1,9 @@ -const BaseCommand = require("../base/BaseCommand"); +const BaseCommand = require("../../base/BaseCommand"); class Repeat extends BaseCommand { /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client */ constructor() { super({ @@ -12,19 +12,20 @@ class Repeat extends BaseCommand { type: 3 // Type 3 is MESSAGE COMMAND. }, aliases: ["r"], // Application command aliases. + dirname: __dirname, guildOnly: true // Determines whether your command is only guild. }); } /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client */ async onLoad() { //... } /** * - * @param {import("../base/JaBa")} client + * @param {import("../../base/JaBa")} client * @param {import("discord.js").ContextMenuInteraction} interaction */ async execute(client, interaction) { diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js index 1c25fd0a..86ab17d3 100644 --- a/commands/Owner/eval.js +++ b/commands/Owner/eval.js @@ -17,6 +17,7 @@ class Eval extends BaseCommand { .setDescription(client.translate("owner/eval:USAGE")) .setRequired(true)), aliases: ["e"], + dirname: __dirname, guildOnly: true, ownerOnly: true }); diff --git a/config.sample.js b/config.sample.js index c7e70c7f..e263f1da 100644 --- a/config.sample.js +++ b/config.sample.js @@ -4,8 +4,8 @@ module.exports = { /* ID of Bot's user */ user: "XXXXXXXXXXX", /* For the support server */ + production: true, // Set to true for production support: { - enabled: false, // Set to false for production id: "XXXXXXXXXXX", // The ID of the support server logs: "XXXXXXXXXXX", // And the ID of the logs channel of your server (new servers for example) }, diff --git a/dashboard/app.js b/dashboard/app.js index 8814c0ea..2990a0b9 100644 --- a/dashboard/app.js +++ b/dashboard/app.js @@ -2,7 +2,7 @@ const config = require("../config"), utils = require("./utils"), CheckAuth = require("./auth/CheckAuth"); -module.exports.load = async(client) => { +module.exports.init = async(client) => { /* Init express app */ const express = require("express"), session = require("express-session"), diff --git a/emojis.json b/emojis.json index b3962b37..31d92b0f 100644 --- a/emojis.json +++ b/emojis.json @@ -8,7 +8,6 @@ "link": "<:atlanta_link:598176933855100976>", "voice": "<:atlanta_voice:598176518891372560>", "add": "<:atlanta_add:598176235700355083>", - "vote": "<:atlanta_vote:598175768274665492>", "help": "<:atlanta_help:598175335078559771>", "warn": "<:atlanta_warn:598179558927106058>", "error": "<:atlanta_error:736144198318686278>", diff --git a/events/CommandHandler.js b/events/CommandHandler.js index bcc84875..d45253b0 100644 --- a/events/CommandHandler.js +++ b/events/CommandHandler.js @@ -24,8 +24,8 @@ class CommandHandler extends BaseEvent { }); data.userData = userData; - if (command.guildOnly && !interaction.inGuild()) return interaction.reply({ content: client.translate("misc:GUILD_ONLY"), ephemeral: true}); - if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.reply({ content: client.translate("misc:OWNER_ONLY"), ephemeral: true }); + if (command.guildOnly && !interaction.inGuild()) return interaction.replyT("misc:GUILD_ONLY", { ephemeral: true }); + if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.replyT("misc:OWNER_ONLY", { ephemeral: true }); if (interaction.inGuild()) { const guildData = await client.findOrCreateGuild({ diff --git a/events/guildCreate.js b/events/Guild/guildCreate.js similarity index 97% rename from events/guildCreate.js rename to events/Guild/guildCreate.js index e6466a1e..5f8b33f9 100644 --- a/events/guildCreate.js +++ b/events/Guild/guildCreate.js @@ -1,5 +1,5 @@ const { MessageEmbed } = require("discord.js"), - BaseEvent = require("../base/BaseEvent"); + BaseEvent = require("../../base/BaseEvent"); class GuildCreate extends BaseEvent { constructor() { diff --git a/events/guildDelete.js b/events/Guild/guildDelete.js similarity index 92% rename from events/guildDelete.js rename to events/Guild/guildDelete.js index 809bb25b..1cca1466 100644 --- a/events/guildDelete.js +++ b/events/Guild/guildDelete.js @@ -1,5 +1,5 @@ const { MessageEmbed } = require("discord.js"), - BaseEvent = require("../base/BaseEvent"); + BaseEvent = require("../../base/BaseEvent"); class GuildDelete extends BaseEvent { constructor() { diff --git a/events/guildMemberAdd.js b/events/Guild/guildMemberAdd.js similarity index 99% rename from events/guildMemberAdd.js rename to events/Guild/guildMemberAdd.js index 4349bebc..a227de96 100644 --- a/events/guildMemberAdd.js +++ b/events/Guild/guildMemberAdd.js @@ -1,5 +1,5 @@ const Canvas = require("canvas"), - BaseEvent = require("../base/BaseEvent"), + BaseEvent = require("../../base/BaseEvent"), { MessageAttachment } = require("discord.js"), { resolve } = require("path"); diff --git a/events/guildMemberRemove.js b/events/Guild/guildMemberRemove.js similarity index 99% rename from events/guildMemberRemove.js rename to events/Guild/guildMemberRemove.js index 60760f10..45eae983 100644 --- a/events/guildMemberRemove.js +++ b/events/Guild/guildMemberRemove.js @@ -1,5 +1,5 @@ const Canvas = require("canvas"), - BaseEvent = require("../base/BaseEvent"), + BaseEvent = require("../../base/BaseEvent"), { MessageAttachment } = require("discord.js"), { resolve } = require("path"); diff --git a/events/guildMemberUpdate.js b/events/Guild/guildMemberUpdate.js similarity index 95% rename from events/guildMemberUpdate.js rename to events/Guild/guildMemberUpdate.js index 54699b86..1ac6bd41 100644 --- a/events/guildMemberUpdate.js +++ b/events/Guild/guildMemberUpdate.js @@ -1,4 +1,4 @@ -const BaseEvent = require("../base/BaseEvent"); +const BaseEvent = require("../../base/BaseEvent"); class GuildMemberUpdate extends BaseEvent { constructor() { diff --git a/events/messageCreate.js b/events/messageCreate.js index 91b70020..e4b709c9 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -34,7 +34,7 @@ class MessageCreate extends BaseEvent { message.guild.data = data.guild = guild; } - if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) return message.sendT("misc:HELLO_SERVER", { username: message.author.username }); + if (message.content.match(new RegExp(`^<@!?${client.user.id}>( |)$`))) return message.replyT("misc:HELLO_SERVER", { username: message.author.username }); if (message.guild) { const memberData = await client.findOrCreateMember({ @@ -68,7 +68,7 @@ class MessageCreate extends BaseEvent { if (afkReason) { data.userData.afk = null; await data.userData.save(); - message.sendT("general/setafk:DELETED", { + message.replyT("general/setafk:DELETED", { username: message.author.username }); } diff --git a/events/ready.js b/events/ready.js index 4a23594e..f7640c62 100644 --- a/events/ready.js +++ b/events/ready.js @@ -19,7 +19,7 @@ class Ready extends BaseEvent { let tServers = client.guilds.cache.size - 1; // Logs some informations using logger - client.logger.log(`Loaded a total of ${commands.length} command(s).`, "log"); + client.logger.log(`Loaded a total of ${commands.length} command(s).`, "ready"); client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready"); client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [Permissions.FLAGS.ADMINISTRATOR] })}`, "ready"); @@ -44,7 +44,7 @@ class Ready extends BaseEvent { clearTransactions.init(client); // Start the dashboard - if (client.config.dashboard.enabled) client.dashboard.load(client); + if (client.config.dashboard.enabled) client.dashboard.init(client); // Update status const version = require("../package.json").version; diff --git a/helpers/autoUpdateDocs.js b/helpers/autoUpdateDocs.js index 5dd5903d..957d5e28 100644 --- a/helpers/autoUpdateDocs.js +++ b/helpers/autoUpdateDocs.js @@ -1,48 +1,40 @@ -/* THIS UPDATES THE DOCS */ -module.exports = { - /** - * Update the doc - * @param {object} client The Discord Client instance - */ - update(client) { - const table = require("markdown-table"), - fs = require("fs"), - commands = client.commands, - categories = []; - commands.forEach((cmd) => { - if (!categories.includes(cmd.help.category)) categories.push(cmd.help.category); +module.exports.update = function (client) { + const table = require("markdown-table"), + fs = require("fs"), + commands = client.commands, + categories = [], + length = [...new Map(commands.map(v => [v.constructor.name, v])).values()].length; + commands.forEach((cmd) => { + if (!categories.includes(cmd.category)) categories.push(cmd.category); + }); + let text = `# JaBa имеет **${length} ${client.getNoun(length, "команда", "команды", "команд")}** в **${categories.length} ${client.getNoun(categories.length, "категории", "категориях", "категориях")}**! \n\n#### Содержимое таблицы \n**Название**: Название команды \n**Описание**: Описание команды \n**Использование**: Использование команды ( [] - обязательно, () - необязательно ) \n**Разрешено использование**: Где можно использовать команду \n\n`; + // categories.sort(function(a, b) { + // const aCmdsSize = commands.filter((cmd) => cmd.category === a).size; + // const bCmdsSize = commands.filter((cmd) => cmd.category === b).size; + // if (aCmdsSize > bCmdsSize) return -1; + // else return 1; + // }) + categories.sort().forEach((cat) => { + const categoriesArray = [ + ["Название", "Описание", "Использование", "Разрешено использование"] + ]; + const cmds = commands.filter((cmd) => cmd.category === cat), + length = [...new Map(cmds.map(v => [v.constructor.name, v])).values()].length; + text += `### ${cat} (${length} ${client.getNoun(length, "команда", "команды", "команд")})\n\n`; + cmds.sort(function (a, b) { + if (a.command.name < b.command.name) return -1; + else return 1; + }).forEach((cmd) => { + categoriesArray.push([ + `**${cmd.command.name}** ${cmd.aliases.length ? `**(${cmd.aliases.join(", ")})**` : ""}`, + client.translate(`${cmd.category.toLowerCase()}/${cmd.command.name}:DESCRIPTION`), + `${cmd.command.name} ${client.translate(`${cmd.category.toLowerCase()}/${cmd.command.name}:USAGE`)}`, + cmd.guildOnly ? "Только на сервере" : "На сервере и в ЛС бота" + ]); }); - let text = `# JaBa имеет свыше **${Math.floor(commands.size / 10)}0 команд** в **${categories.length} категориях**! \n\n#### Содержимое таблицы \n**Название**: Название команды \n**Описание**: Описание команды \n**Использование**: Использование команды ( [] - обязательно, () - необязательно ) \n**Разрешено использование**: Где можно использовать команду \n**Откат**: Время, через которое команду можно будет использовать повторно\n\n`; - - // categories.sort(function(a, b) { - // const aCmdsSize = commands.filter((cmd) => cmd.help.category === a).size; - // const bCmdsSize = commands.filter((cmd) => cmd.help.category === b).size; - // if (aCmdsSize > bCmdsSize) return -1; - // else return 1; - // }) - categories.sort().forEach((cat) => { - const arrCat = [ - ["Название", "Описание", "Использование", "Разрешено использование", "Откат"] - ]; - const cmds = commands.filter((cmd) => cmd.help.category === cat); - text += `### ${cat} (${cmds.size} ${client.getNoun(cmds.size, "команда", "команды", "команд")})\n\n`; - cmds.sort(function (a, b) { - if (a.help.name < b.help.name) return -1; - else return 1; - }).forEach((cmd) => { - arrCat.push([ - `**${cmd.help.name}** ${cmd.help.aliases.length ? `**(${cmd.help.aliases.join(", ")})**` : ""}`, - client.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:DESCRIPTION`), - client.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:USAGE`), - cmd.conf.guildOnly ? "Только на сервере" : "На сервере и в ЛС бота", - `${Math.ceil(cmd.conf.cooldown / 1000)} ${client.getNoun(Math.ceil(cmd.conf.cooldown / 1000), "секунда", "секунды", "секунд")}` - ]); - }); - text += `${table(arrCat)}\n\n`; - }); - - if (!fs.existsSync("./dashboard/public/docs")) fs.mkdirSync("./dashboard/public/docs"); - fs.writeFileSync("./dashboard/public/docs/commands.md", text); - client.logger.log("Dashboard docs updated!"); - } + text += `${table(categoriesArray)}\n\n`; + }); + if (!fs.existsSync("./dashboard/public/docs")) fs.mkdirSync("./dashboard/public/docs"); + fs.writeFileSync("./dashboard/public/docs/commands.md", text); + client.logger.log("Dashboard docs updated!"); }; \ No newline at end of file diff --git a/helpers/birthdays.js b/helpers/birthdays.js index 5b8f58d6..a8fd0982 100644 --- a/helpers/birthdays.js +++ b/helpers/birthdays.js @@ -1,7 +1,7 @@ const CronJob = require("cron").CronJob, Discord = require("discord.js"); -async function init(client) { +module.exports.init = async function (client) { new CronJob("0 5 * * *", async function () { client.guilds.cache.forEach(async (guild) => { const date = new Date(), @@ -55,8 +55,4 @@ async function init(client) { } }); }, null, true, "Europe/Moscow"); -} - -module.exports = { - init }; \ No newline at end of file diff --git a/helpers/checkReminds.js b/helpers/checkReminds.js index 71edc3f5..57e8351a 100644 --- a/helpers/checkReminds.js +++ b/helpers/checkReminds.js @@ -1,51 +1,44 @@ const Discord = require("discord.js"); -/* THIS CHECK IF THERE IS A REMIND MUST BE SENT */ -module.exports = { - /** - * Starts checking... - * @param {object} client The Discord Client instance - */ - init(client) { - client.usersData - .find({ reminds: { $gt: [] } }) - .then((users) => { - for (const user of users) { - if (!client.users.cache.has(user.id)) client.users.fetch(user.id); - client.databaseCache.usersReminds.set(user.id, user); - } - }); - setInterval(async function () { - const dateNow = Date.now(); - client.databaseCache.usersReminds.forEach(async (user) => { - const dUser = client.users.cache.get(user.id); - if (dUser) { - const reminds = user.reminds; - const mustSent = reminds.filter((r) => r.sendAt < dateNow); - if (mustSent.length > 0) { - mustSent.forEach((r) => { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: client.translate("general/remindme:TITLE") - }) - .addField(client.translate("common:CREATION"), client.translate("general/remindme:CREATED", { - time: client.convertTime(r.createdAt, "from") - })) - .addField(client.translate("common:MESSAGE"), r.message) - .setColor(client.config.embed.color) - .setFooter({ - text: client.config.embed.footer - }); - dUser.send({ - embeds: [embed] +module.exports.init = function (client) { + client.usersData + .find({ reminds: { $gt: [] } }) + .then((users) => { + for (const user of users) { + if (!client.users.cache.has(user.id)) client.users.fetch(user.id); + client.databaseCache.usersReminds.set(user.id, user); + } + }); + setInterval(async function () { + const dateNow = Date.now(); + client.databaseCache.usersReminds.forEach(async (user) => { + const dUser = client.users.cache.get(user.id); + if (dUser) { + const reminds = user.reminds; + const mustSent = reminds.filter((r) => r.sendAt < dateNow); + if (mustSent.length > 0) { + mustSent.forEach((r) => { + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: client.translate("general/remindme:TITLE") + }) + .addField(client.translate("common:CREATION"), client.translate("general/remindme:CREATED", { + time: client.convertTime(r.createdAt, "from") + })) + .addField(client.translate("common:MESSAGE"), r.message) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer }); + dUser.send({ + embeds: [embed] }); - user.reminds = user.reminds.filter((r) => r.sendAt >= dateNow); - user.save(); - if (user.reminds.length === 0) client.databaseCache.usersReminds.delete(user.id); - } + }); + user.reminds = user.reminds.filter((r) => r.sendAt >= dateNow); + user.save(); + if (user.reminds.length === 0) client.databaseCache.usersReminds.delete(user.id); } - }); - }, 1000); - } + } + }); + }, 1000); }; \ No newline at end of file diff --git a/helpers/checkUnmutes.js b/helpers/checkUnmutes.js index 0bfabe38..afd8fc52 100644 --- a/helpers/checkUnmutes.js +++ b/helpers/checkUnmutes.js @@ -1,67 +1,59 @@ const Discord = require("discord.js"); -module.exports = { - /** - * Check if there is a user to unmute - * @param {object} client The Discord Client instance - */ - async init(client) { - client.membersData - .find({ "mute.muted": true }) - .then((members) => { - members.forEach((member) => { - client.databaseCache.mutedUsers.set(`${member.id}${member.guildID}`, member); - }); - }); - setInterval(async () => { - client.databaseCache.mutedUsers.filter((m) => m.mute.endDate <= Date.now()).forEach(async (memberData) => { - const guild = client.guilds.cache.get(memberData.guildID); - if (!guild) return; - const member = guild.members.cache.get(memberData.id) || await guild.members.fetch(memberData.id).catch(() => { - memberData.mute = { - muted: false, - endDate: null, - case: null - }; - memberData.save(); - client.logger.log("[unmute] " + memberData.id + " cannot be found."); - - return null; - }); - const guildData = await client.findOrCreateGuild({ - id: guild.id - }); - guild.data = guildData; - if (member) { - guild.channels.cache.forEach((channel) => { - const permOverwrites = channel.permissionOverwrites.cache.get(member.id); - if (permOverwrites) permOverwrites.delete(); - }); - } - const user = member ? member.user : await client.users.fetch(memberData.id); - const embed = new Discord.MessageEmbed() - .setDescription(guild.translate("moderation/unmute:SUCCESS_CASE", { - user: user.toString(), - usertag: user.tag, - count: memberData.mute.case - })) - .setColor("#f44271") - .setFooter({ - text: guild.client.config.embed.footer - }); - const channel = guild.channels.cache.get(guildData.plugins.modlogs); - if (channel) channel.send({ - embeds: [embed] - }); +module.exports.init = async function (client) { + client.membersData + .find({ "mute.muted": true }) + .then((members) => { + members.forEach((member) => client.databaseCache.mutedUsers.set(`${member.id}${member.guildID}`, member)); + }); + setInterval(async () => { + client.databaseCache.mutedUsers.filter((m) => m.mute.endDate <= Date.now()).forEach(async (memberData) => { + const guild = client.guilds.cache.get(memberData.guildID); + if (!guild) return; + const member = guild.members.cache.get(memberData.id) || await guild.members.fetch(memberData.id).catch(() => { memberData.mute = { muted: false, endDate: null, case: null }; - client.databaseCache.mutedUsers.delete(`${memberData.id}${memberData.guildID}`); - await memberData.save(); + memberData.save(); + client.logger.log("[unmute] " + memberData.id + " cannot be found."); + return null; }); - }, 1000); - } + + const guildData = await client.findOrCreateGuild({ + id: guild.id + }); + + if (member) { + guild.channels.cache.forEach((channel) => { + const permOverwrites = channel.permissionOverwrites.cache.get(member.id); + if (permOverwrites) permOverwrites.delete(); + }); + } + const user = member ? member.user : await client.users.fetch(memberData.id); + const embed = new Discord.MessageEmbed() + .setDescription(guild.translate("moderation/unmute:SUCCESS_CASE", { + user: user.toString(), + usertag: user.tag, + count: memberData.mute.case + })) + .setColor("#F44271") + .setFooter({ + text: guild.client.config.embed.footer + }); + const channel = guild.channels.cache.get(guildData.plugins.modlogs); + if (channel) channel.send({ embeds: [embed] }); + + memberData.mute = { + muted: false, + endDate: null, + case: null + }; + + client.databaseCache.mutedUsers.delete(`${memberData.id}${memberData.guildID}`); + await memberData.save(); + }); + }, 1000); }; \ No newline at end of file diff --git a/helpers/clearTransactions.js b/helpers/clearTransactions.js index 60dc1634..a12f658e 100644 --- a/helpers/clearTransactions.js +++ b/helpers/clearTransactions.js @@ -1,19 +1,18 @@ -module.exports = { - async init(client) { - setInterval(async () => { - const timestamp = Date.now() + 30 * 24 * 60 * 60 * 1000; // day hour min sec msec / 1 month - const members = client.membersData.find({ transactions: { $gt: [] } }); +module.exports.init = async function (client) { + setInterval(async () => { + // Date.now() + days * hours * mins * secs * msecs / 1 month + const timestamp = Date.now() + 30 * 24 * 60 * 60 * 1000; + const members = client.membersData.find({ transactions: { $gt: [] } }); - for (const member of members) { - const transactions = member.transactions; - for await (const transaction of transactions) { - if (transaction.date < timestamp) { - const index = transactions.indexOf(transaction); - transactions.splice(index, 1); - await member.save(); - } + for (const member of members) { + const transactions = member.transactions; + for await (const transaction of transactions) { + if (transaction.date < timestamp) { + const index = transactions.indexOf(transaction); + transactions.splice(index, 1); + await member.save(); } } - }, 24 * 60 * 60 * 1000); // every 24 hours - }, + } + }, 7 * 24 * 60 * 60 * 1000); // every 7 days }; \ No newline at end of file diff --git a/helpers/discordTogether.js b/helpers/discordTogether.js index 1faa8156..e7a2157b 100644 --- a/helpers/discordTogether.js +++ b/helpers/discordTogether.js @@ -1,6 +1,4 @@ -module.exports = { - init(client) { - const { DiscordTogether } = require("discord-together"); - client.discordTogether = new DiscordTogether(client); - } +module.exports.init = function (client) { + const { DiscordTogether } = require("discord-together"); + client.discordTogether = new DiscordTogether(client); }; \ No newline at end of file diff --git a/helpers/extenders.js b/helpers/extenders.js index 46c372bf..b61a4b2c 100644 --- a/helpers/extenders.js +++ b/helpers/extenders.js @@ -1,11 +1,4 @@ -const { Guild, Message } = require("discord.js"); - -Guild.prototype.translate = function (key, args) { - const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); - if (!language) throw "Message: Invalid language set in data."; - - return language(key, args); -}; +const { Message, Interaction } = require("discord.js"); Message.prototype.translate = function (key, args) { const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); @@ -14,39 +7,49 @@ Message.prototype.translate = function (key, args) { return language(key, args); }; -// Wrapper for sendT with error emoji -Message.prototype.error = function (key, args, options = {}) { - options.prefixEmoji = "error"; - - return this.sendT(key, args, options); -}; - -// Wrapper for sendT with success emoji -Message.prototype.success = function (key, args, options = {}) { - options.prefixEmoji = "success"; - - return this.sendT(key, args, options); -}; - -// Translate and send the message -Message.prototype.sendT = function (key, args, options = {}) { - let string = this.translate(key, args); +Message.prototype.replyT = function (key, args, options = {}) { + let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; if (options.edit) return this.edit(string); else return this.reply({ content: string }); }; -// Format a date -Message.prototype.printDate = function (date, format) { - return this.client.printDate(date, format, this.guild.data.language); +Message.prototype.error = function (key, args, options = {}) { + options.prefixEmoji = "error"; + + return this.replyT(key, args, options); }; -// Convert time -Message.prototype.convertTime = function (time, type, noPrefix) { - return this.client.convertTime(time, type, noPrefix, (this.guild && this.guild.data) ? this.guild.data.language : null); +Message.prototype.success = function (key, args, options = {}) { + options.prefixEmoji = "success"; + + return this.replyT(key, args, options); }; -Message.prototype.getNoun = function (number, one, two, five) { - return this.client.getNoun(number, one, two, five); +Interaction.prototype.translate = function (key, args) { + const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); + if (!language) throw "Message: Invalid language set in data."; + + return language(key, args); +}; + +Interaction.prototype.replyT = function (key, args, options = {}) { + let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); + if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; + + if (options.edit) return this.editReply(string); + else return this.reply({ content: string, ephemeral: options.ephemeral || false, fetchReply: options.fetchReply || false }); +}; + +Interaction.prototype.error = function (key, args, options = {}) { + options.prefixEmoji = "error"; + + return this.replyT(key, args, options); +}; + +Interaction.prototype.success = function (key, args, options = {}) { + options.prefixEmoji = "success"; + + return this.replyT(key, args, options); }; \ No newline at end of file diff --git a/helpers/functions.js b/helpers/functions.js index 230809d3..6d8781bf 100644 --- a/helpers/functions.js +++ b/helpers/functions.js @@ -1,31 +1,10 @@ -const { Permissions } = require("discord.js"); -const languages = require("../languages/language-meta.json").map((l) => l.moment).filter((l) => l !== "en"); -languages.forEach((lang) => { +const { Permissions } = require("discord.js"), + langs = require("../languages/language-meta.json").map((l) => l.moment).filter((l) => l !== "en"); +langs.forEach((lang) => { require(`moment/locale/${lang}.js`); }); module.exports = { - getPrefix(message, data) { - if (message.channel.type !== "DM") { - const prefixes = [ - `<@!${message.client.user.id}> `, - `<@${message.client.user.id}> `, - `<@!${message.client.user.id}>`, - `<@${message.client.user.id}>`, - message.client.user.username.toLowerCase(), - data.guild.prefix - ]; - - let prefix = null; - - prefixes.forEach((p) => { - if (message.content.startsWith(p) || message.content.toLowerCase().startsWith(p)) prefix = p; - }); - - return prefix; - } else return true; - }, - async createInvite(client, guildId) { const guild = client.guilds.cache.get(guildId); const member = guild.me; @@ -70,49 +49,5 @@ module.exports = { randomNum(min, max) { return Math.floor(Math.random() * (max - min) + min + 1); - }, - - convertTime(guild, time) { - const absoluteSeconds = Math.floor((time / 1000) % 60); - const absoluteMinutes = Math.floor((time / (1000 * 60)) % 60); - const absoluteHours = Math.floor((time / (1000 * 60 * 60)) % 24); - const absoluteDays = Math.floor(time / (1000 * 60 * 60 * 24)); - - const d = absoluteDays ? - absoluteDays === 1 ? - guild.translate("time:ONE_DAY") : - guild.translate("time:DAYS", { - amount: absoluteDays - }) : - null; - const h = absoluteHours ? - absoluteHours === 1 ? - guild.translate("time:ONE_HOUR") : - guild.translate("time:HOURS", { - amount: absoluteHours - }) : - null; - const m = absoluteMinutes ? - absoluteMinutes === 1 ? - guild.translate("time:ONE_MINUTE") : - guild.translate("time:MINUTES", { - amount: absoluteMinutes - }) : - null; - const s = absoluteSeconds ? - absoluteSeconds === 1 ? - guild.translate("time:ONE_SECOND") : - guild.translate("time:SECONDS", { - amount: absoluteSeconds - }) : - null; - - const absoluteTime = []; - if (d) absoluteTime.push(d); - if (h) absoluteTime.push(h); - if (m) absoluteTime.push(m); - if (s) absoluteTime.push(s); - - return absoluteTime.join(", "); } }; \ No newline at end of file diff --git a/helpers/logger.js b/helpers/logger.js index 79cb58b4..5b37e262 100644 --- a/helpers/logger.js +++ b/helpers/logger.js @@ -11,9 +11,9 @@ function dateTimePad(value, digits) { } function format(tDate) { - return (tDate.getFullYear() + "-" + + return (tDate.getDate() + "-" + dateTimePad((tDate.getMonth() + 1), 2) + "-" + - dateTimePad(tDate.getDate(), 2) + " " + + dateTimePad(tDate.getFullYear(), 2) + " " + dateTimePad(tDate.getHours(), 2) + ":" + dateTimePad(tDate.getMinutes(), 2) + ":" + dateTimePad(tDate.getSeconds(), 2) + "." + diff --git a/helpers/tictactoe.js b/helpers/tictactoe.js index 48fc188a..7b5e37ed 100644 --- a/helpers/tictactoe.js +++ b/helpers/tictactoe.js @@ -1,10 +1,10 @@ // Thanks to simply-djs for this =) -const Discord = require("discord.js"); +const { MessageEmbed, MessageButton, MessageActionRow } = require("discord.js"); /** - * @param message Discord Message - * @param options Array of Options + * @param {require("discord.js").Message} message + * @param {Array} options */ /** slash => Boolean @@ -23,7 +23,6 @@ const Discord = require("discord.js"); idleEmoji => (Emoji ID) String */ - async function tictactoe(message, options = []) { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve) => { @@ -73,7 +72,7 @@ async function tictactoe(message, options = []) { const foot = options.embedFoot ? { text: options.embedFoot } : { text: "Удачи =)" }; - const acceptEmbed = new Discord.MessageEmbed() + const acceptEmbed = new MessageEmbed() .setTitle(message.translate("economy/tictactoe:REQUEST_WAIT", { user: opponent.tag })) @@ -85,17 +84,17 @@ async function tictactoe(message, options = []) { .setFooter(foot) .setTimestamp(); - const accept = new Discord.MessageButton() + const accept = new MessageButton() .setLabel(message.translate("economy/tictactoe:ACCEPT")) .setStyle("SUCCESS") .setCustomId("acceptttt"); - const decline = new Discord.MessageButton() + const decline = new MessageButton() .setLabel(message.translate("economy/tictactoe:DECLINE")) .setStyle("DANGER") .setCustomId("declinettt"); - const accep = new Discord.MessageActionRow().addComponents([ + const accep = new MessageActionRow().addComponents([ accept, decline ]); @@ -199,7 +198,7 @@ async function tictactoe(message, options = []) { }; const { MessageActionRow, MessageButton } = require("discord.js"); - const epm = new Discord.MessageEmbed() + const epm = new MessageEmbed() .setTitle(message.translate("economy/tictactoe:DESCRIPTION")) .setColor(options.embedColor || "#075FFF") .setFooter(foot) @@ -845,7 +844,7 @@ async function tictactoe(message, options = []) { collector.on("end", (collected, reason) => { if (reason == "time") { - const embed = new Discord.MessageEmbed() + const embed = new MessageEmbed() .setTitle(message.translate("economy/tictactoe:NO_ANSWER_TITLE")) .setAuthor({ name: (message.user ? message.user : message.author).tag, @@ -864,7 +863,7 @@ async function tictactoe(message, options = []) { }); } if (reason == "decline") { - const embed = new Discord.MessageEmbed() + const embed = new MessageEmbed() .setTitle(message.translate("economy/tictactoe:CANCELED")) .setAuthor({ name: (message.user ? message.user : message.author).tag, diff --git a/index.js b/index.js index f5aadc0c..13873d65 100644 --- a/index.js +++ b/index.js @@ -9,8 +9,10 @@ const client = new JaBa({ }); (async () => { + client.translations = await require("./helpers/languages")(); + await client.loadEvents("../events"); - await client.loadCommands("../commands", client.config.support.enabled ? client.config.support.id : ""); + await client.loadCommands("../commands", client.config.support.production ? "" : client.config.support.id); await client.init(); })(); diff --git a/languages/en-US/general/invite.json b/languages/en-US/general/invite.json index 1573418a..e80f8c25 100644 --- a/languages/en-US/general/invite.json +++ b/languages/en-US/general/invite.json @@ -6,6 +6,5 @@ "CLICK": "[**Click**]({{link}})", "TIP": "Send `invite copy` to be able to copy the invite link!", "ADD": "Invite JaBa", - "VOTE": "Vote for JaBa", "SUPPORT": "Support developer" } \ No newline at end of file diff --git a/languages/en-US/general/suggest.json b/languages/en-US/general/suggest.json index 0742f2ab..61d512e2 100644 --- a/languages/en-US/general/suggest.json +++ b/languages/en-US/general/suggest.json @@ -4,6 +4,5 @@ "EXAMPLES": "suggest New channel #offtopic please", "MISSING_CHANNEL": "No suggestion channel defined!", "MISSING_CONTENT": "Please enter a suggestion!", - "TITLE": "Suggestion - {{user}}", - "SUCCESS": "Your suggestion is being voted in {{channel}}!" + "TITLE": "Suggestion - {{user}}" } \ No newline at end of file diff --git a/languages/en-US/general/userinfo.json b/languages/en-US/general/userinfo.json index f25efba5..561cf3cf 100644 --- a/languages/en-US/general/userinfo.json +++ b/languages/en-US/general/userinfo.json @@ -6,6 +6,5 @@ "NO_GAME": "Not playing", "NO_ROLE": "No role", "NO_NICKNAME": "No nickname", - "MORE_ROLES": "and {{count}} others roles", - "BOT_STATS": "**{{votes}}** votes ([top.gg](https://top.gg))\n**{{servers}}** servers\n**{{shards}}** shards\nUsing **{{lib}}**" + "MORE_ROLES": "and {{count}} others roles" } \ No newline at end of file diff --git a/languages/en-US/misc.json b/languages/en-US/misc.json index 77be4bc5..7b83904b 100644 --- a/languages/en-US/misc.json +++ b/languages/en-US/misc.json @@ -14,8 +14,6 @@ "NO_PERMS": "You must have an administration rights to perform this action!", "NO_REASON_PROVIDED": "No reason provided", "NO_USER_FOUND_ID": "No user on Discord has the ID `{{id}}`!", - "VOTE_DM": "⬆️ Hello {{user}}, thanks for voting!\nHere's your reward: 40 credits (on the support server)!", - "VOTE_LOGS": "⬆️ **{{usertag}}** (`{{userid}}`) voted for **JaBa** and won **40** credits, thank you!\n", "HELLO_SERVER": "Hello **{{username}}**, my prefix on this server is ``. Use `help` to get the list of the commands!", "HELLO_DM": "Hello, as you are currently in direct message you don't need to add a prefix before command name.", "GUILD_ONLY": "This command is only available on a server!", diff --git a/languages/en-US/music/stop.json b/languages/en-US/music/stop.json index a8d04d6d..e3bfeb3b 100644 --- a/languages/en-US/music/stop.json +++ b/languages/en-US/music/stop.json @@ -2,6 +2,5 @@ "DESCRIPTION": "Stop the music", "USAGE": "stop", "EXAMPLES": "stop", - "VOTE_CONTENT": "React with 👍 to stop the music! {{requiredCount}} more votes are required.", "SUCCESS": "Music stopped!" } \ No newline at end of file diff --git a/languages/ru-RU/general/invite.json b/languages/ru-RU/general/invite.json index f5371766..135c88c2 100644 --- a/languages/ru-RU/general/invite.json +++ b/languages/ru-RU/general/invite.json @@ -6,6 +6,5 @@ "CLICK": "[**Тык**]({{link}})", "TIP": "Отправьте `invite copy`, чтобы получить ссылку для копирования!", "ADD": "Пригласить JaBa", - "VOTE": "Проголосовать за JaBa", "SUPPORT": "Поддержать разработчика" } \ No newline at end of file diff --git a/languages/ru-RU/general/userinfo.json b/languages/ru-RU/general/userinfo.json index 018f8bcf..078a0986 100644 --- a/languages/ru-RU/general/userinfo.json +++ b/languages/ru-RU/general/userinfo.json @@ -7,6 +7,5 @@ "NO_ROLE": "Нет роли", "ROLE": "Высшая роль", "NO_NICKNAME": "Нет никнейма", - "MORE_ROLES": "и ещё {{count}} роль(и/ей)", - "BOT_STATS": "**{{votes}}** голосов ([top.gg](https://top.gg))\n**{{servers}}** серверов\n**{{shards}}** шардов\nИспользует **{{lib}}**" + "MORE_ROLES": "и ещё {{count}} роль(и/ей)" } \ No newline at end of file diff --git a/languages/ru-RU/misc.json b/languages/ru-RU/misc.json index 4a249aae..60f9138c 100644 --- a/languages/ru-RU/misc.json +++ b/languages/ru-RU/misc.json @@ -15,8 +15,6 @@ "NO_PERMS": "Недостаточно прав для выполнения данного действия!", "NO_REASON_PROVIDED": "Причина не указана", "NO_USER_FOUND_ID": "Пользователя с ID `{{id}}` не существует!", - "VOTE_DM": "⬆️ Привет, {{user}}, спасибо за голос!\nТвоя награда - 50 кредитов (на сервере поддержки)!", - "VOTE_LOGS": "⬆️ **{{usertag}}** (`{{userid}}`) проголосовал за **JaBa** и получил **50** кредитов, спасибо!\n", "HELLO_SERVER": "Привет, **{{username}}**! Все мои команды доступны через **/** Используйте `/help`, чтобы получить список команд!", "GUILD_ONLY": "Данную команду можно использовать только на сервере!", "MISSING_BOT_PERMS": "Мне необходимы следующие права для выполнения данной команды: {{list}}", diff --git a/languages/uk-UA/general/invite.json b/languages/uk-UA/general/invite.json index 135550af..64299f20 100644 --- a/languages/uk-UA/general/invite.json +++ b/languages/uk-UA/general/invite.json @@ -6,6 +6,5 @@ "CLICK": "[**Тик**]({{link}})", "TIP": "Відправте `invite copy`, щоб отримати посилання для копіювання!", "ADD": "Запросити JaBa", - "VOTE": "Проголосувати за JaBa", "SUPPORT": "Підтримати розробника" } \ No newline at end of file diff --git a/languages/uk-UA/general/userinfo.json b/languages/uk-UA/general/userinfo.json index 2206b62f..af802dde 100644 --- a/languages/uk-UA/general/userinfo.json +++ b/languages/uk-UA/general/userinfo.json @@ -7,6 +7,5 @@ "NO_ROLE": "Немає ролі", "ROLE": "Вища роль", "NO_NICKNAME": "Немає нікнейму", - "MORE_ROLES": "і ще {{count}} роль(і/ей)", - "BOT_STATS": "**{{votes}}** голосів ([top.gg](https://top.gg))\n**{{servers}}** серверів\n**{{shards }}** шардів\nВикористовує **{{lib}}**" + "MORE_ROLES": "і ще {{count}} роль(і/ей)" } \ No newline at end of file diff --git a/languages/uk-UA/misc.json b/languages/uk-UA/misc.json index 5b92dd92..e4194d45 100644 --- a/languages/uk-UA/misc.json +++ b/languages/uk-UA/misc.json @@ -15,8 +15,6 @@ "NO_PERMS": "Недостатньо прав для виконання цієї дії!", "NO_REASON_PROVIDED": "Причина не вказана", "NO_USER_FOUND_ID": "Користувача з ID `{{id}}` не існує!", - "VOTE_DM": "⬆️ Привіт, {{user}}, дякую за голос!\nТвоя нагорода - 50 кредитів (на сервері підтримки)!", - "VOTE_LOGS": "⬆️ **{{usertag}}** (`{{userid}}`) проголосував за **JaBa** і отримав **50** кредитів, дякую!\n", "HELLO_SERVER": "Привіт, **{{username}}**, мій префікс на даному сервері - ``. Використовуйте `help`, щоб отримати список команд!", "HELLO_DM": "Привіт, тому що ви пишете в ОП, вам не потрібно використовувати префікс.", "GUILD_ONLY": "Цю команду можна використовувати лише на сервері!", diff --git a/scripts/verify-config.js b/scripts/verify-config.js index 4cc801cf..ea6c39c6 100644 --- a/scripts/verify-config.js +++ b/scripts/verify-config.js @@ -1,11 +1,11 @@ /* eslint-disable no-async-promise-executor */ -const config = require("../config"); -const fetch = require("node-fetch"); - -const chalk = require("chalk"); -const success = (message) => console.log(` ${chalk.green("✓")} ${message}`); -const error = (message, howToFix) => console.log(` ${chalk.red("✗")} ${message}${howToFix ? ` : ${howToFix}` : ""}`); -const ignore = (message) => console.log(` ${chalk.yellow("~")} ${message}`); +const { Intents } = require("discord.js"), + config = require("../config"), + fetch = require("node-fetch"), + chalk = require("chalk"), + success = (message) => console.log(` ${chalk.green("✓")} ${message}`), + error = (message, howToFix) => console.log(` ${chalk.red("✗")} ${message}${howToFix ? ` : ${howToFix}` : ""}`), + ignore = (message) => console.log(` ${chalk.yellow("~")} ${message}`); const checks = [ () => { @@ -23,7 +23,7 @@ const checks = [ console.log("\n\nDiscord Bot"); return new Promise((res) => { const Discord = require("discord.js"); - const client = new Discord.Client(); + const client = new Discord.Client({ intents: Object.keys(Intents.FLAGS) }); let readyResolve; new Promise((resolve) => readyResolve = resolve); client.login(config.token).then(async () => { @@ -55,7 +55,7 @@ const checks = [ success("Connection to Mongo database success"); res(); }).catch(() => { - error("Should be able to connect to Mongo database", "please verify if the MongoDB server is started"); + error("Not able to connect to Mongo database", "please verify if the MongoDB server is started"); res(); }); }); @@ -64,7 +64,7 @@ const checks = [ console.log("\n\nAPI keys"); return new Promise(async (resolve) => { if (!config.apiKeys.amethyste) { - ignore("Amethyste API is not configured, key should not be checked."); + ignore("Amethyste API is not configured, skipping check."); } else { const res = await fetch("https://v1.api.amethyste.moe/generate/blurple", { method: "POST", @@ -74,13 +74,13 @@ const checks = [ }); const result = await res.json(); if (result.status === 401) { - error("Should be a valid Amethyste API key", "get your key here: https://api.amethyste.moe/"); + error("Not valid Amethyste API key", "get your key here: https://api.amethyste.moe/"); } else { success("Valid Amethyste API key"); } } if (!config.apiKeys.blagueXYZ) { - ignore("blague.xyz API is not configured, key should not be checked."); + ignore("blague.xyz API is not configured, skipping check."); } else { const res = await fetch("https://blague.xyz/api/joke/random", { headers: { @@ -89,27 +89,11 @@ const checks = [ }); const result = await res.json(); if (result.status === 401) { - error("Should be a valid blague.xyz key", "get your key here: https://blague.xyz/"); + error("Not valid blague.xyz key", "get your key here: https://blague.xyz/"); } else { success("Valid blague.xyz key"); } } - if (!config.apiKeys.dbl) { - ignore("DBL API is not configured, key should not be checked."); - } else { - const res = await fetch("https://top.gg/api/bots/check?userId=test", { - method: "POST", - headers: { - Authorization: config.apiKeys.dbl - } - }); - const result = await res.json(); - if (result.error && result.error === "Unauthorized") { - error("Should be a valid DBL key", "get your key here: https://top.gg/ OR delete the key from the config if you don't have a key"); - } else { - success("Valid DBL key"); - } - } resolve(); }); }, @@ -117,7 +101,7 @@ const checks = [ console.log("\n\nDashboard"); return new Promise(async (resolve) => { if (!config.dashboard.enabled) { - ignore("Dashboard is not enabled, config shouldn't be checked."); + ignore("Dashboard is not enabled, skipping check."); } else { const checkPortTaken = (port) => { return new Promise((resolve) => { @@ -138,7 +122,7 @@ const checks = [ }; const isPortTaken = await checkPortTaken(config.dashboard.port); if (isPortTaken) { - error("Dashboard port should be available", "you have probably another process using this port"); + error("Dashboard port not available", "you have probably another process using this port"); } else { success("Dashboard port is available"); } From 0675cf5a5b384d2f6e7eba4fe404b655f82f799d Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Tue, 26 Jul 2022 19:46:32 +0500 Subject: [PATCH 05/16] =?UTF-8?q?=D0=A3=D0=B4=D0=B0=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D1=8B=20=D0=BB=D0=BE=D0=BA=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B4=D0=BB=D1=8F=20=D1=83=D0=B4=D0=B0=D0=BB?= =?UTF-8?q?=D1=91=D0=BD=D0=BD=D1=8B=D1=85=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD?= =?UTF-8?q?=D0=B4,=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=B4=D0=BE=D0=BA=D0=BE?= =?UTF-8?q?=D0=B2,=20=D1=84=D0=B8=D0=BA=D1=81=20=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4?= =?UTF-8?q?,=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B7=D0=B0=D0=B3=D1=80?= =?UTF-8?q?=D1=83=D0=B7=D0=BA=D0=B8=20=D0=B8=20=D0=B5=D1=91=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/json/words/ru-RU.json | 1 - base/BaseCommand.js | 2 +- base/JaBa.js | 90 ++++++++++++++++--- commands/Owner/reload.js | 58 ++++++++++++ events/CommandHandler.js | 2 +- helpers/autoUpdateDocs.js | 13 ++- index.js | 2 +- .../ru-RU/administration/addcommand.json | 8 -- .../ru-RU/administration/delcommand.json | 8 -- languages/ru-RU/economy/findwords.json | 13 --- languages/ru-RU/economy/transactions.json | 1 - languages/ru-RU/fun/choice.json | 9 -- .../ru-RU/{images => general}/avatar.json | 0 languages/ru-RU/general/permissions.json | 6 -- languages/ru-RU/general/quote.json | 8 -- languages/ru-RU/images/approved.json | 5 -- languages/ru-RU/images/batslap.json | 5 -- languages/ru-RU/images/beautiful.json | 5 -- languages/ru-RU/images/bed.json | 5 -- languages/ru-RU/images/brazzers.json | 5 -- languages/ru-RU/images/burn.json | 5 -- languages/ru-RU/images/captcha.json | 5 -- languages/ru-RU/images/challenger.json | 5 -- languages/ru-RU/images/clyde.json | 6 -- languages/ru-RU/images/crush.json | 5 -- languages/ru-RU/images/dictator.json | 5 -- languages/ru-RU/images/facepalm.json | 5 -- languages/ru-RU/images/fire.json | 5 -- languages/ru-RU/images/jail.json | 5 -- languages/ru-RU/images/love.json | 5 -- languages/ru-RU/images/magik.json | 5 -- languages/ru-RU/images/mission.json | 5 -- languages/ru-RU/images/phcomment.json | 6 -- languages/ru-RU/images/ps4.json | 5 -- languages/ru-RU/images/qrcode.json | 7 -- languages/ru-RU/images/rip.json | 5 -- languages/ru-RU/images/scary.json | 5 -- languages/ru-RU/images/steamcard.json | 5 -- languages/ru-RU/images/tobecontinued.json | 5 -- languages/ru-RU/images/trash.json | 5 -- languages/ru-RU/images/triggered.json | 5 -- languages/ru-RU/images/wanted.json | 5 -- languages/ru-RU/images/wasted.json | 5 -- languages/ru-RU/images/youtube-comment.json | 5 -- languages/ru-RU/music/filter.json | 9 -- languages/ru-RU/music/filters.json | 7 -- languages/ru-RU/music/lyrics.json | 10 --- languages/ru-RU/owner/eval.json | 2 +- languages/ru-RU/time.json | 10 --- .../uk-UA/administration/addcommand.json | 8 -- .../uk-UA/administration/delcommand.json | 8 -- languages/uk-UA/administration/ignore.json | 7 -- languages/uk-UA/economy/findwords.json | 13 --- languages/uk-UA/economy/transactions.json | 1 - languages/uk-UA/fun/choice.json | 9 -- .../uk-UA/{images => general}/avatar.json | 0 languages/uk-UA/general/permissions.json | 6 -- languages/uk-UA/general/quote.json | 8 -- languages/uk-UA/images/approved.json | 5 -- languages/uk-UA/images/batslap.json | 5 -- languages/uk-UA/images/beautiful.json | 5 -- languages/uk-UA/images/bed.json | 5 -- languages/uk-UA/images/brazzers.json | 5 -- languages/uk-UA/images/burn.json | 5 -- languages/uk-UA/images/captcha.json | 5 -- languages/uk-UA/images/challenger.json | 5 -- languages/uk-UA/images/clyde.json | 6 -- languages/uk-UA/images/crush.json | 5 -- languages/uk-UA/images/dictator.json | 5 -- languages/uk-UA/images/facepalm.json | 5 -- languages/uk-UA/images/fire.json | 5 -- languages/uk-UA/images/jail.json | 5 -- languages/uk-UA/images/love.json | 5 -- languages/uk-UA/images/magik.json | 5 -- languages/uk-UA/images/mission.json | 5 -- languages/uk-UA/images/phcomment.json | 6 -- languages/uk-UA/images/ps4.json | 5 -- languages/uk-UA/images/qrcode.json | 7 -- languages/uk-UA/images/rip.json | 5 -- languages/uk-UA/images/scary.json | 5 -- languages/uk-UA/images/steamcard.json | 5 -- languages/uk-UA/images/tobecontinued.json | 5 -- languages/uk-UA/images/trash.json | 5 -- languages/uk-UA/images/triggered.json | 5 -- languages/uk-UA/images/wanted.json | 5 -- languages/uk-UA/images/wasted.json | 5 -- languages/uk-UA/images/youtube-comment.json | 5 -- languages/uk-UA/music/filter.json | 9 -- languages/uk-UA/music/filters.json | 7 -- languages/uk-UA/music/lyrics.json | 10 --- languages/uk-UA/time.json | 10 --- 91 files changed, 146 insertions(+), 507 deletions(-) delete mode 100644 assets/json/words/ru-RU.json create mode 100644 commands/Owner/reload.js delete mode 100644 languages/ru-RU/administration/addcommand.json delete mode 100644 languages/ru-RU/administration/delcommand.json delete mode 100644 languages/ru-RU/economy/findwords.json delete mode 100644 languages/ru-RU/fun/choice.json rename languages/ru-RU/{images => general}/avatar.json (100%) delete mode 100644 languages/ru-RU/general/permissions.json delete mode 100644 languages/ru-RU/general/quote.json delete mode 100644 languages/ru-RU/images/approved.json delete mode 100644 languages/ru-RU/images/batslap.json delete mode 100644 languages/ru-RU/images/beautiful.json delete mode 100644 languages/ru-RU/images/bed.json delete mode 100644 languages/ru-RU/images/brazzers.json delete mode 100644 languages/ru-RU/images/burn.json delete mode 100644 languages/ru-RU/images/captcha.json delete mode 100644 languages/ru-RU/images/challenger.json delete mode 100644 languages/ru-RU/images/clyde.json delete mode 100644 languages/ru-RU/images/crush.json delete mode 100644 languages/ru-RU/images/dictator.json delete mode 100644 languages/ru-RU/images/facepalm.json delete mode 100644 languages/ru-RU/images/fire.json delete mode 100644 languages/ru-RU/images/jail.json delete mode 100644 languages/ru-RU/images/love.json delete mode 100644 languages/ru-RU/images/magik.json delete mode 100644 languages/ru-RU/images/mission.json delete mode 100644 languages/ru-RU/images/phcomment.json delete mode 100644 languages/ru-RU/images/ps4.json delete mode 100644 languages/ru-RU/images/qrcode.json delete mode 100644 languages/ru-RU/images/rip.json delete mode 100644 languages/ru-RU/images/scary.json delete mode 100644 languages/ru-RU/images/steamcard.json delete mode 100644 languages/ru-RU/images/tobecontinued.json delete mode 100644 languages/ru-RU/images/trash.json delete mode 100644 languages/ru-RU/images/triggered.json delete mode 100644 languages/ru-RU/images/wanted.json delete mode 100644 languages/ru-RU/images/wasted.json delete mode 100644 languages/ru-RU/images/youtube-comment.json delete mode 100644 languages/ru-RU/music/filter.json delete mode 100644 languages/ru-RU/music/filters.json delete mode 100644 languages/ru-RU/music/lyrics.json delete mode 100644 languages/ru-RU/time.json delete mode 100644 languages/uk-UA/administration/addcommand.json delete mode 100644 languages/uk-UA/administration/delcommand.json delete mode 100644 languages/uk-UA/administration/ignore.json delete mode 100644 languages/uk-UA/economy/findwords.json delete mode 100644 languages/uk-UA/fun/choice.json rename languages/uk-UA/{images => general}/avatar.json (100%) delete mode 100644 languages/uk-UA/general/permissions.json delete mode 100644 languages/uk-UA/general/quote.json delete mode 100644 languages/uk-UA/images/approved.json delete mode 100644 languages/uk-UA/images/batslap.json delete mode 100644 languages/uk-UA/images/beautiful.json delete mode 100644 languages/uk-UA/images/bed.json delete mode 100644 languages/uk-UA/images/brazzers.json delete mode 100644 languages/uk-UA/images/burn.json delete mode 100644 languages/uk-UA/images/captcha.json delete mode 100644 languages/uk-UA/images/challenger.json delete mode 100644 languages/uk-UA/images/clyde.json delete mode 100644 languages/uk-UA/images/crush.json delete mode 100644 languages/uk-UA/images/dictator.json delete mode 100644 languages/uk-UA/images/facepalm.json delete mode 100644 languages/uk-UA/images/fire.json delete mode 100644 languages/uk-UA/images/jail.json delete mode 100644 languages/uk-UA/images/love.json delete mode 100644 languages/uk-UA/images/magik.json delete mode 100644 languages/uk-UA/images/mission.json delete mode 100644 languages/uk-UA/images/phcomment.json delete mode 100644 languages/uk-UA/images/ps4.json delete mode 100644 languages/uk-UA/images/qrcode.json delete mode 100644 languages/uk-UA/images/rip.json delete mode 100644 languages/uk-UA/images/scary.json delete mode 100644 languages/uk-UA/images/steamcard.json delete mode 100644 languages/uk-UA/images/tobecontinued.json delete mode 100644 languages/uk-UA/images/trash.json delete mode 100644 languages/uk-UA/images/triggered.json delete mode 100644 languages/uk-UA/images/wanted.json delete mode 100644 languages/uk-UA/images/wasted.json delete mode 100644 languages/uk-UA/images/youtube-comment.json delete mode 100644 languages/uk-UA/music/filter.json delete mode 100644 languages/uk-UA/music/filters.json delete mode 100644 languages/uk-UA/music/lyrics.json delete mode 100644 languages/uk-UA/time.json diff --git a/assets/json/words/ru-RU.json b/assets/json/words/ru-RU.json deleted file mode 100644 index da511572..00000000 --- a/assets/json/words/ru-RU.json +++ /dev/null @@ -1 +0,0 @@ -["абажур","абажурчик","абаз","абазин","абазинец","абазинка","абазинцы","абазины","абак","абака","аббат","аббатиса","аббатисса","аббатство","аббревиатура","абвер","абверовец","аберрация","абзац","абиогенез","абиссаль","абиссинец","абиссинка","абиссинцы","абитуриент","абитуриентка","аболиционизм","аболиционист","аболиционистка","абонемент","абонент","абордаж","абориген","аборигенка","аборигены","аборт","абразив","абразия","абракадабра","абрек","абрикос","абрикосик","абрикотин","абрис","абсент","абсентеизм","абсолют","абсолютизация","абсолютизирование","абсолютизм","абсолютист","абсолютистка","абсолютность","абсорбент","абсорбция","абстрагирование","абстракт","абстрактность","абстракционизм","абстракционист","абстракционистка","абстракция","абсурд","абсурдность","абсцесс","абсцисса","абулия","абхаз","абхазец","абхазка","абхазцы","абхазы","абцуг","абшид","авангард","авангардизм","авангардист","аванзал","аванзала","аванложа","аванпорт","аванпост","аванс","авансирование","авансодатель","авансодержатель","авансцена","авансы","авантаж","авантажность","авантюра","авантюризм","авантюрин","авантюрист","авантюристка","авантюрность","аварец","аварийка","аварийность","аварийщик","авария","аварка","аварцы","авары","авгит","авгур","август","августинец","авеню","авиа","авиабаза","авиабилет","авиабомба","авиагоризонт","авиадесант","авиадесантник","авиаконструктор","авиалайнер","авиалиния","авиамагистраль","авиаматка","авиамеханик","авиамоделизм","авиамоделист","авиамодель","авиамотор","авианосец","авиапассажир","авиапочта","авиасалон","авиаспорт","авиастроение","авиастроитель","авиатор","авиатранспорт","авиатрасса","авиация","авиачасть","авиашкола","авиетка","авизо","авитаминоз","авокадо","авось","авоська","аврал","авральщина","Аврора","австерия","австралиец","австралийка","австралийцы","Австралия","австриец","австрийка","австрийцы","австрияк","австриячка","автаркия","авто","автобаза","автобат","автобиограф","автобиографизм","автобиографичность","автобиография","автоблокировка","автобус","автобусик","автобусник","автовагон","автовесы","автовокзал","автовышка","автогамия","автоген","автогенщик","автогигант","автогонка","автогонки","автогонщик","автогонщица","автогравюра","автоград","автограф","автография","автодело","автодиспетчер","автодорога","автодорожник","автодрезина","автодром","автожир","автозавод","автозаводец","автозаправщик","автоинспектор","автоинспекция","автокар","автоклав","автоклуб","автоколонна","автокомбинат","автокормушка","автокран","автокрановщик","автокрановщица","автократ","автократия","автол","автолавка","автолиз","автолитография","автолюбитель","автомагистраль","автомат","автоматизация","автоматизирование","автоматизм","автоматика","автоматичность","автоматчик","автоматчица","автомашина","автомашинист","автомеханик","автомобилеразгрузчик","автомобилестроение","автомобилестроитель","автомобилизация","автомобилизм","автомобилист","автомобилистка","автомобиль","автомобильчик","автомотоклуб","автомотолотерея","автомотриса","автономия","автономность","автопарк","автопилот","автоплатформа","автопогрузчик","автопоезд","автопоилка","автопокрышка","автопортрет","автоприцеп","автопробег","автор","авторалли","автореферат","авторефрижератор","авторизация","авторитаризм","авторитарность","авторитет","авторитетность","авторские","авторство","авторулевой","авторучка","авторша","автосалон","автосварка","автосварщик","автослесарь","автоспорт","автостанция","автостоп","автостоянка","автострада","автостроение","автостроитель","автосцепка","автотележка","автотипия","автотормоз","автотранспорт","автотранспортник","автотрасса","автотропизм","автотуризм","автотурист","автотягач","автофургон","автохозяйство","автохтон","автохтоны","автоцементовоз","автоцистерна","автошина","автоштурман","ага","агава","агальматолит","агама","агами","агамия","агамы","агар","агар-агар","агаряне","агарянин","агарянка","агат","агглютинативность","агглютинация","агглютинирование","аггравация","агент","агентство","агентура","агиография","агитатор","агитаторша","агитационность","агитация","агитбригада","агитирование","агитка","агитпроп","агитпункт","агломерат","агломератчик","агломерация","агнат","агнаты","агнец","агница","агнозия","агностик","агностицизм","агония","агорафобия","аграмант","аграрий","аграрник","аграф","аграфия","агрегат","агрегатирование","агрегатчик","агреман","агрессивность","агрессины","агрессия","агрессор","агроклиматология","агрокультура","агролесомелиоратор","агролесомелиорация","агромелиоратор","агромелиорация","агрометеоролог","агрометеорология","агроминимум","агроном","агрономия","агротехник","агротехника","агрофизик","агрофизика","агрохимик","агрохимия","агрохимлаборатория","агу","агукание","агул","агулка","агулы","ад","адажио","Адам","адамант","адамсит","адаптация","адаптер","адаптивность","адаптометр","адат","адвекция","адвентизм","адвентист","адвербиализация","адвокат","адвокатство","адвокатура","адгезия","адекватность","аденовирус","аденовирусы","аденоид","аденоиды","аденома","адепт","аджарец","аджарка","аджарцы","аджика","адинамия","администратор","администраторство","администраторша","администрация","администрирование","адмирал","адмиралтейств-коллегия","адмиралтейство","адмиральство","адмиральша","адоптация","адреналин","адрес","адресант","адресат","адрес-календарь","адресок","адресочек","адряс","адсорбент","адсорбция","адуляр","адъективация","адъюнкт","адъюнктство","адъюнктура","адъютант","адъютантская","адъютантство","адыгеец","адыгейка","адыгейцы","адюльтер","ажан","ажгон","ажио","ажиотаж","ажитация","ажур","ажурность","аз","азалия","азан","азарт","азартность","азбука","азбуковник","азбучность","азербайджанец","азербайджанка","азербайджанцы","азиат","азиатец","азиатка","азиатцы","азиатчина","азиаты","азид","азимут","Азия","азональность","азооспермия","азот","азотемия","азотизация","азотирование","азотобактер","азотобактерин","азотоген","азу","азур","азурит","азы","азям","аи","айва","айван","айе-айе","айкание","аил","айлант","аймак","аир","айран","айсберг","айсор","айсорка","айсоры","аист","аистёнок","аистиха","аистник","аистовые","аистообразные","аисты","академгородок","академизм","академик","академист","академистка","академичность","академия","акажу","акание","акант","акарицид","акароз","акарология","акафист","акация","аквадаг","акваланг","аквалангист","аквалангистка","аквамарин","акваметрия","аквамобиль","акванавт","акванавтика","акванавтка","акваплан","акварелист","акварелистка","акварель","акварелька","акварий","аквариум","аквариумист","акватинта","акватипия","акватория","акведук","аквилегия","аквилон","акинезия","акклиматизатор","акклиматизация","акклиматизирование","акколада","аккомодация","аккомпанемент","аккомпаниатор","аккомпаниаторша","аккомпанирование","аккорд","аккордеон","аккордеонист","аккордеонистка","аккредитация","аккредитив","аккредитование","аккумулирование","аккумулятор","аккумуляция","аккуратист","аккуратистка","аккуратность","акмеизм","акмеист","акмеистка","аконит","акр","акрида","акрил","акрихин","акробат","акробатика","акробатка","акрополь","акростих","аксакал","аксамит","акселерант","акселерат","акселератка","акселератор","акселерация","акселерометр","аксельбант","аксессуар","аксиома","аксиоматика","аксон","акт","актёр","актёрка","актёрство","актив","активатор","активация","активизация","активизирование","активирование","активист","активистка","активность","актинии","актиний","актиния","актинограф","актинометр","актинометрия","актирование","актриса","актуализация","актуализирование","актуализм","актуальность","акты","акула","акулёнок","акуловые","акулы","акустик","акустика","акушер","акушерка","акушерство","акцент","акцентирование","акцентология","акцентуация","акцепт","акциденция","акциз","акционер","акция","акын","аларм","аларма","алармист","алатырь","албанец","албанка","албанцы","алгвазил","алгебра","алгебраист","алгоритм","алгоритмизация","алебарда","алебардист","алебардник","алебардщик","алебастр","александрит","алеут","алеутка","алеуты","алжирец","алжирка","алжирцы","алиби","ализарин","алиментщик","алименты","алкалоид","алкаш","алкоголизм","алкоголик","алкоголичка","алкоголь","алконост","Алкоран","Алла","Аллах","аллегоризм","аллегоричность","аллегория","аллегретто","аллегри","аллегро","аллейка","аллерген","аллергик","аллергия","аллерголог","аллергология","аллея","аллигатор","аллигаторы","аллилуйщик","аллилуйщина","аллилуйя","аллитерация","аллопат","аллопатия","аллохтон","аллохтоны","аллювий","аллюзия","аллюр","алмаз","алмазик","алмазник","алогизм","алогичность","алость","алоэ","алтабас","алтаец","алтайка","алтайцы","алтарь","алтей","алтын","алтынник","алунит","алфавит","алхимик","алхимия","алчба","алчность","алчущая","алчущий","алыча","альбатрос","альбатросы","альбедо","альбинизм","альбинос","альбиноска","альбом","альбомец","альбомчик","альбумин","альбумины","альвеола","альгвазил","альдегид","альдегиды","алькальд","альков","альмавива","альма-матер","альманах","альмандин","альпака","альпеншток","альпинарий","альпиниада","альпинизм","альпинист","альпинистка","альт","альтерация","альтернатива","альтернативность","альтиметр","альтист","альтистка","альтруизм","альтруист","альтруистичность","альтруистка","альфа","альфа-лучи","альфа-распад","альфа-терапия","альфа-частица","альфа-частицы","альфонс","альфреско","альянс","алюминий","алюминщик","аляповатость","амазонка","амальгама","амальгамация","амальгамирование","аманат","амариллис","аматёр","амбар","амбарик","амбарушка","амбарчик","амбивалентность","амбистома","амбистомы","амбиции","амбициозность","амбиция","амбра","амбразура","амбре","амброзия","амбулатория","амвон","амёба","амёбы","Америка","американец","американизация","американизм","американист","американистика","американистка","американка","американцы","аметист","амидопирин","амикошонство","аминазин","аминокислота","аминокислоты","аминь","аммиак","аммонал","аммоний","аммофос","амнезия","амнистирование","амнистированная","амнистированный","амнистия","аморализм","аморалка","аморальность","амортизатор","амортизация","аморфность","ампер","амперметр","ампир","амплитуда","амплификация","амплуа","ампула","ампулка","ампутация","амулет","амуниция","Амур","амур","амуры","амфибия","амфибрахий","амфитеатр","амфитрион","амфора","анабиоз","анаграмма","анаконда","анализ","анализатор","анализирование","аналитик","аналитика","аналог","аналогия","аналой","анальгетик","анальгетики","анальгин","анамнез","ананас","ананасик","анапест","анархизм","анархист","анархистка","анархичность","анархия","анархо-синдикализм","анархо-синдикалист","анатом","анатомирование","анатомичка","анатомия","анафема","анафора","анахорет","анахронизм","анахроничность","анаэроб","анаэробиоз","анаэробы","ангажемент","ангажирование","ангар","ангел","ангелок","ангелочек","ангел-хранитель","ангидрид","ангидрит","ангина","ангиома","англез","англиканизм","англиканство","англицизм","англичане","англичанин","англичанка","англоман","англомания","англоманка","англоманство","англосакс","англосаксонец","англосаксонцы","англосаксы","англофил","англофильство","англофоб","англофобство","анголец","анголка","ангольцы","ангстрем","анданте","андантино","андезит","аневризма","анекдот","анекдотец","анекдотик","анекдотист","анекдотчик","анемия","анемограф","анемометр","анемон","анемона","анемофилия","анероид","анестезин","анестезиолог","анестезиология","анестезия","анид","аника-воин","анилин","анимализм","анималист","анимизм","анимист","анимистка","анион","анис","анисовая","анисовка","анкер","анкерок","анкета","анкетирование","анкилоз","анкилостома","анклав","анналист","анналисты","анналы","аннексионист","аннексирование","аннексия","аннотация","аннотирование","аннулирование","аннушка","анод","анодирование","аномалия","аноним","анонимка","анонимность","анонимщик","анонимщица","анонс","анонсирование","анормальность","анортит","анортозит","аносмия","анофелес","ансамбль","ант","антабка","антаблемент","антабус","антагонизм","антагонист","антагонистичность","антагонисты","Антанта","Антей","антенна","антенны","антибиотик","антибиотики","антивещество","антивитамин","антивитамины","антиген","антигены","антигриппин","антидарвинизм","антидепрессант","антидепрессанты","антидот","антик","антиква","антиквар","антиквариат","антикварий","антиклиналь","антикоагулянт","антикоммунизм","антикоммунист","антикритика","антилопа","антимилитаризм","антимилитарист","антимир","антимонит","антимония","антинаучность","антинейтрино","антинейтрон","антиномия","антиобледенитель","антиокислитель","антипассат","антипатичность","антипатия","антипирин","антипод","антиподы","антипротон","антиракета","антироман","антисанитария","антисемит","антисемитизм","антисемитка","антисептик","антисептика","антисептики","антисептирование","антисоветизм","антисоветчик","антисоветчина","антисоветчица","антистатик","антистрофа","антитеза","антитезис","антитела","антитело","антитоксин","антитоксины","антифашист","антифашистка","антифон","антифоны","антифриз","Антихрист","антициклон","антиципация","античастица","античастицы","античность","антиэлектрон","антиядро","антология","антоним","антоновка","антономазия","антоциан","антракоз","антракт","антрацен","антрацит","антраша","антре","антрекот","антрепренёр","антрепренёрство","антрепренёрша","антреприза","антресоли","антресоль","антропогенез","антропоид","антрополог","антропология","антропометр","антропометрия","антропоморфизация","антропоморфизм","антропонимика","антропоноз","антропософия","антропофаг","антропофагия","антропоцентризм","антураж","антуриум","анты","анурия","анфельция","анфилада","анчар","анчоус","анчоусовые","анчоусы","аншеф","аншлаг","аншлюс","анэнцефалия","аониды","аорист","аорта","апартамент","апартаменты","апартеид","апатит","апатичность","апатия","апаш","апеллирование","апелляция","апельсин","апельсинчик","аперитив","апилак","аплодирование","аплодисменты","апломб","апогей","Апокалипсис","апокалипсис","апокриф","аполитизм","аполитицизм","аполитичность","Аполлон","аполлон","аполог","апологет","апологетика","апология","апоплексия","апорт","апостериорность","апостол","апостроф","апострофа","апофегма","апофеоз","апоцентр","аппарат","аппаратик","аппаратная","аппаратура","аппаратчик","аппаратчица","аппарель","аппендикс","аппендицит","апперкот","апперцепция","аппетит","аппетитец","аппетитность","аппликатура","аппликация","апплике","аппозиция","аппрет","аппретирование","аппретура","апрель","априорность","апробация","апробирование","апрош","апроши","апсида","аптека","аптекарша","аптекарь","аптекоуправление","аптечка","ар","араб","арабеск","арабеска","арабески","арабизм","арабист","арабистика","арабка","арабы","арак","аракчеевщина","аралиевые","аралия","арамеец","арамеи","арамей","арамейка","арамейцы","аранжировка","арап","арапка","арапник","арапчонок","арат","араукария","арахис","арахнология","арба","арбалет","арбалетчик","арбитр","арбитраж","арболит","арборицид","арбуз","арбузик","арбузище","аргали","аргамак","аргентина","аргентинец","аргентинка","аргентинцы","арго","аргон","аргонавт","аргонавты","арготизм","аргумент","аргументация","аргументирование","аргументированность","аргус","ареал","арека","арена","аренда","арендатор","арендование","ареометр","ареопаг","арест","арестант","арестантка","арестантская","арестованная","арестованный","ариетта","ариец","арии","арийка","арийцы","ариозо","аристарх","аристократ","аристократизм","аристократичность","аристократия","аристократка","аристократство","аристон","аритмия","арифметик","арифметика","арифмограф","арифмометр","ария","арк","арка","аркада","аркадия","Аркадия","аркан","аркатура","аркебуз","аркебуза","аркебузир","арлекин","арлекинада","армада","арматура","арматурщик","арматурщица","армеец","армирование","армировка","армия","армяк","армяне","армянин","армянка","армячишко","армячок","арника","аромат","ароматизатор","ароматизация","ароматы","арочка","арпеджио","арпеджо","арсенал","артель","артельщик","артериосклероз","артерия","артикль","артикуляция","артиллерист","артиллерия","артист","артистизм","артистическая","артистичность","артистка","артишок","артналёт","артобстрел","артподготовка","артрит","артроз","арфа","арфист","арфистка","архаизация","архаизирование","архаизм","архаика","архаист","архаистика","архаичность","архалук","архангел","архар","архарёнок","архаровец","археограф","археография","археолог","археология","археоптерикс","археоциаты","архетип","архив","архивариус","архивист","архивоведение","архивольт","архивохранилище","архидиакон","архидьякон","архиепископ","архиерей","архимандрит","архипастырь","архипелаг","архитектоника","архитектор","архитектура","архитрав","архонт","арча","арчинец","арчинка","арчинцы","аршин","аршинник","арык","арьергард","ас","асбест","асбестит","асбестоцемент","асбоцемент","асептика","асессор","асессорша","асимметричность","асимметрия","аскарида","аскаридоз","аскер","аскет","аскетизм","аскорбинка","Асмодей","аспарагус","аспект","аспид","аспиды","аспирант","аспирантка","аспирантура","аспират","аспиратор","аспираты","аспирация","аспирин","ассамблея","ассенизатор","ассенизация","ассигнаты","ассигнации","ассигнация","ассигнование","ассигнования","ассигновка","ассимилирование","ассимилятор","ассимиляторство","ассимиляция","ассириец","ассирийка","ассирийцы","ассириолог","ассириология","ассирияне","ассириянин","ассириянка","ассистент","ассистентка","ассистентская","ассистентура","ассистирование","ассонанс","ассорти","ассортимент","ассоциативность","ассоциация","астат","астеник","астения","астеносфера","астероид","астигматизм","астма","астматик","астматичка","астра","астрагал","астробиология","астроботаника","астрогеография","астрограф","астродатчик","астродинамика","астроклимат","астрокомпас","астролог","астрология","астролябия","астрометрия","астронавигация","астронавт","астронавтика","астроном","астрономия","астроориентация","астрофизик","астрофизика","астрофотография","астрофотометр","астрофотометрия","асфалия","асфальт","асфальтирование","асфальтировка","асфальтировщик","асфальтировщица","асфальтобетон","асфальтоукладчик","асфиксия","асцит","атавизм","атака","атаксия","атаман","атаманец","атаманство","атаманша","атас","атеизм","атеист","атеистка","ателье","атеросклероз","атипичность","атлант","Атлант","атлас","атласец","атлет","атлетизм","атлетика","атмосфера","атолл","атом","атомизм","атомист","атомистика","атомник","атомоход","атомщик","атония","атрибут","атрибутивность","атрибуты","атропин","атрофия","атташе","аттестат","аттестация","аттик","аттракцион","атукание","ау","аудиенция","аудитор","аудитория","аукание","аукцион","аукционер","аукционист","аул","аура","аустерия","аут","аутентичность","аутодафе","аутотренинг","аутсайдер","афазия","афалина","афганец","афганка","афганцы","афелий","афера","аферист","аферистка","афиша","афиширование","афишка","афоризм","афористичность","Африка","африканер","африканеры","африканец","африканист","африканистика","африканка","африканцы","афронт","аффект","аффектация","аффикс","аффинаж","аффриката","ах","ахание","ахинея","ацетат","ацетилен","ацетон","ацидофилин","ацтек","ацтеки","ашуг","аэрарий","аэрация","аэроб","аэробика","аэробиоз","аэробус","аэробы","аэровокзал","аэрограф","аэродинамика","аэродром","аэрозоль","аэроклуб","аэролит","аэролог","аэрология","аэромеханика","аэрон","аэронавигация","аэронавт","аэронавтика","аэроплан","аэропорт","аэросани","аэростат","аэростатика","аэросъёмка","аэрофотоснимок","аэрофотосъёмка","баба","бабахание","бабашка","баба-яга","баббит","бабёнка","бабёночка","бабенька","бабёшка","бабища","бабка","бабки","бабник","бабонька","бабочка","бабочник","бабр","бабуин","бабуленька","бабуля","бабуся","бабуша","бабуши","бабушка","бабьё","баварец","баварка","баварцы","багаж","багажная","багажник","багги","баггист","багермейстер","багет","багетчик","багетчица","багор","багорик","багорок","багорчик","багорщик","багрение","багрец","багрильщик","багровище","багровость","багрянец","багряница","багряность","багульник","бадан","бадейка","бадминтон","бадминтонист","бадья","бадьян","баз","база","базальт","базар","базарчик","базилик","базилика","базирование","базировка","базис","базука","бай","байбак","байбачество","байбачина","байга","байда","байдара","байдарка","байдарочник","байдарочница","байка","байрам","байронизм","байство","байстрюк","бак","бакалавр","бакалейщик","бакалея","бакан","бакаут","бакен","бакенбарда","бакенбардист","бакенбарды","бакенщик","бакены","баки","баккара","баклага","баклажан","баклажка","баклан","бакланы","баклуша","баклуши","баковый","бактерии","бактериолог","бактериология","бактерионоситель","бактерионосительство","бактериофаг","бактерицидность","бактерия","бакун","бакунизм","бакшиш","бакштаг","бакштов","бал","балабол","балаболка","балабон","балаган","балаганчик","балаганщик","балагур","балагурство","балалаечка","балалаечник","балалайка","баламут","баламутка","баланда","баланс","балансёр","балансир","балансирование","балансировка","балансировщик","балахон","балахонник","балахончик","балбера","балбес","балда","балдахин","балерина","балеринка","балерун","балет","балетка","балетки","балетмейстер","балетная","балетовед","балетоман","балетомания","балетоманка","балка","балканистика","балкар","балкарец","балкарка","балкарцы","балкары","балкон","балконная","балкончик","балл","баллада","балладник","балласт","балластер","балластировка","баллиста","баллистик","баллистика","баллистокардиография","баллон","баллончик","баллотирование","баллотировка","балльник","бал-маскарад","балобан","баловень","баловник","баловница","баловство","балок","балочка","балык","балычок","бальза","бальзам","бальзамин","бальзаминовые","бальзамирование","бальнеолог","бальнеология","бальнеотерапия","балюстрада","балясина","балясинка","балясник","балясница","балясы","бамбук","бамбучина","бампер","банальность","банальщина","банан","бананник","банановоз","бананы","банда","бандаж","бандажи","бандерильеро","бандерилья","бандероль","бандеролька","банджо","бандит","бандитизм","бандура","бандурист","бандуристка","бандюга","бани","баниан","банк","банка","банкаброш","банкаброшница","банкет","банкетка","банки","банкир","банкнот","банкнота","банкноты","банкомат","банкомёт","банкрот","банкротство","банлон","банник","баночка","баночки","бант","бантик","банту","бантустан","банчок","банщик","банщица","банька","баньян","баня","баобаб","баптизм","баптист","баптистка","бар","барабан","барабанчик","барабанщик","барабанщица","барабошка","барабулька","барак","баран","баранина","баранинка","баранка","бараночка","бараночник","бараночница","баранта","баранчик","барахлишко","барахло","барахолка","барахольщик","барахольщица","барахтание","барашек","барашки","барбамил","барбарис","барбарисовые","барбос","барвинок","баргузин","бард","бардак","бареж","барекс","барельеф","барельефчик","баретка","баретки","бареттер","баржа","баржестроение","баржонка","барибал","барий","барин","барисфера","барит","баритон","баритонист","барич","барк","барка","баркан","баркарола","баркас","баркасик","баркентина","бармен","барменша","бармы","барнаулка","барограф","барокамера","барокко","барометр","барон","баронесса","баронет","баронетство","баронство","баронша","баротерапия","баротравма","барочка","барочник","барраж","барражирование","барракуда","баррель","баррикада","барс","барсёнок","барственность","барство","барсук","барсучиха","барсучок","барсучонок","бархан","барханы","бархат","бархатистость","бархатка","бархатность","бархатцы","бархотка","барчонок","барчук","барщина","барыга","барынька","барыня","барыш","барышник","барышничество","барышня","барьер","барьерист","барьеристка","барьерчик","бас","басенка","басенник","басист","басище","баск","баска","баскак","баскетбол","баскетболист","баскетболистка","баски","басконка","басма","басмач","басмачество","басни","баснописец","баснословие","баснь","басня","басовитость","басок","басон","бассейн","бастард","бастион","бастурма","бастующая","бастующий","басурман","басурманка","басы","баталист","баталия","батальон","батальонный","батарейка","батарея","батат","батенька","батиаль","батиплан","батискаф","батист","батисфера","батман","батник","батог","батожок","батометр","батон","батончик","батрак","батрачество","батрачка","батрачонок","баттерфляй","батут","батыр","батырь","батька","батько","батюшка","батя","баул","баульчик","бахание","бахвал","бахвалка","бахвальство","бахила","бахилы","бахрома","бахромка","бахта","бахтарма","Бахус","бахча","бахчевник","бахчевод","бахчеводство","бахчевые","бацилла","бациллоноситель","бачки","бачок","башенка","башка","башкир","башкирец","башкирка","башкирцы","башкиры","башковитость","башлык","башлычок","башмак","башмаки","башмачки","башмачник","башмачок","башнёр","башня","баштан","баюкание","баядера","баядерка","баян","баянист","баянистка","бдение","бдительность","беби","бег","бега","бегание","бегемот","бегемоты","беглая","беглец","беглость","беглый","беглянка","бегониевые","бегония","беготня","бегство","бегун","бегунки","бегунок","бегуны","бегунья","беда","бедлам","бедная","бедность","беднота","бедный","бедняга","бедняжечка","бедняжка","бедняк","беднячка","бедокур","бедокурка","бедолага","бёдра","бедро","бедственность","бедствие","бедуин","бедуинка","бедуины","беженец","беженка","беженство","безаварийность","безалаберность","безалаберщина","безапелляционность","безбилетник","безбилетница","безбожие","безбожник","безбожница","безболезненность","безбоязненность","безбрачие","безбрежие","безбрежность","безверие","безвестная","безвестность","безвестный","безветрие","безвинная","безвинный","безвкусие","безвкусица","безвластие","безводье","безвозвратное","безвозвратность","безвозмездность","безволие","безвредность","безвременье","безвыходность","безглазая","безгласность","безголосица","безголосье","безграмотная","безграмотность","безграмотный","безграничность","безгрешность","бездарность","бездарь","бездейственность","бездействие","безделица","безделка","безделушечка","безделушка","безделье","бездельник","бездельница","бездельничание","бездельничество","безденежность","безденежье","бездетность","бездеятельность","бездна","бездождье","бездоказательность","бездолье","бездомная","бездомник","бездомница","бездомничество","бездомность","бездомный","бездомовник","бездомье","бездонность","бездонье","бездорожица","бездорожье","бездумность","бездумье","бездуховность","бездушие","бездушность","бездымка","бездымность","безе","безжалостность","безжизненность","беззаботность","беззаветность","беззаконие","беззаконник","беззаконница","беззаконность","беззастенчивость","беззащитность","беззвучие","беззвучность","безземелье","безземельный","беззлобие","беззлобность","беззубка","беззубость","безик","безлесье","безликость","безличие","безличность","безлошадник","безлошадный","безлуние","безлюдность","безлюдство","безлюдье","безматок","безмен","безмерность","безмозглость","безмолвие","безмыслие","безмятежность","безнадёжность","безнадзорность","безнаказанность","безначалие","безногая","безногий","безносая","безнравственность","безобидность","безоблачность","безобразие","безобразник","безобразница","безобразность","безоглядность","безоговорочность","безопасность","безоружность","безосновательность","безостановочность","безответность","безответственность","безотвязность","безотказность","безотлагательность","безотносительность","безотрадность","безотцовщина","безотчётность","безошибочность","безработица","безработная","безработный","безрадостность","безраздельность","безразличие","безразличность","безрассудность","безрассудство","безрезультатность","безрогость","безродная","безродный","безропотность","безрукавка","безрукая","безрукий","безрукость","безрыбица","безрыбье","безубыточность","безударность","безудержность","безукоризненность","безумец","безумие","безумная","безумность","безумный","безумство","безупречность","безусадочность","безусловность","безуспешность","безутешность","безучастие","безучастность","безъязыкий","безъязычие","безъязычные","безыдейность","безызвестность","безымённость","безымянка","безымянность","безынерционность","безынициативность","безынтересность","безыскусность","безыскусственность","безысходность","бей","бейка","бейсбол","бейсболист","бейсболка","бейт","бек","бекар","бекас","бекасёнок","бекасинник","бекасы","бекеша","бекешка","бекон","бел","белая","белёк","белемнит","белемниты","белена","беление","беленькая","белесоватость","белёсость","белец","бели","белиберда","белизна","белила","белильня","белитель","белица","беличьи","белка","белки","белкование","белковость","белладонна","беллетризация","беллетрист","беллетристика","беллетристка","белобилетник","белобилетчик","беловатость","беловик","белогвардеец","белоглазка","белоглазки","белодеревец","белодеревщик","белодушка","белое","белозор","белок","белокопытник","белокровие","белокрыльник","белокурость","беломестец","беломестцы","беломошник","белопогонник","белоподкладочник","белорус","белоруска","белорусы","белоручка","белорыбица","белоснежность","белость","белотал","белоус","белочка","белошвейка","белоэмигрант","белуга","белуджи","белужина","белужинка","белужка","белуха","белые","белый","бель","бельведер","бельгиец","бельгийка","бельгийцы","бельдюга","бельё","бельевая","бельецо","бельишко","бельканто","бельмо","бельмы","бельчонок","бельэтаж","беляк","беляки","беляна","белянка","белянки","беляночка","беляш","беляши","бемоль","бенгалец","бенгали","бенгалка","бенгальцы","бенедиктин","бенедиктинец","бенедиктинцы","бенефис","бенефициант","бенефициантка","бензин","бензинчик","бензобак","бензовоз","бензозаправка","бензозаправщик","бензоколонка","бензол","бензонасос","бензопила","бензопровод","бензорез","бензорезчик","бензохранилище","бентонит","бентос","бенуар","бербер","берберка","берберы","бергамот","бердан","бердана","берданка","бёрдо","бердыш","берег","берегиня","береговик","береговой","бережёная","бережёный","бережливость","бережность","бережок","бережочек","берёза","березина","березит","берёзка","березник","берёзник","березничек","берёзничек","березняк","березнячок","берёзовая","берёзовик","берёзовица","берёзовка","берёзовые","берёзонька","берейтор","берека","беременная","беременность","беремя","берендеи","берендей","бересклет","бересклетовые","берест","береста","берёста","берестина","берёстка","берестянка","берет","беретик","беретка","бери-бери","берилл","бериллий","берклий","берковец","беркут","берлин","берлина","берлога","берсальер","берсальеры","Бес","бес","бес-девка","беседа","беседка","беседочка","бесёнок","бесклассовость","бескозырка","бескомпромиссность","бесконечное","бесконечность","бесконтрольность","бесконфликтность","бескормица","бескорыстие","бескорыстность","бескрайность","бескрылость","бескрылые","бескультурье","беснование","бесноватая","бесноватый","беснующаяся","беснующийся","Бесовка","бесовка","беспамятность","беспамятство","беспардонность","беспартийная","беспартийность","беспартийный","беспаспортная","беспаспортность","беспаспортный","бесперебойность","бесперспективность","беспечальная","беспечальный","беспечность","бесписьменная","бесписьменный","бесплановость","бесплатность","бесплодие","бесплодность","бесплотность","бесповоротность","беспозвоночные","беспокойства","беспокойство","бесполезность","беспомощность","беспоповец","беспоповщина","беспородность","беспорочность","беспорточный","беспорядки","беспорядок","беспорядочность","беспочвенность","беспощадность","бесправие","бесправность","беспредельность","беспредметность","беспрекословие","беспрекословность","беспрепятственность","беспрерывность","беспрецедентность","бесприветность","бесприданница","беспризорная","беспризорник","беспризорница","беспризорность","беспризорный","беспримерность","беспринципность","беспристрастие","беспристрастность","беспритязательность","беспричинность","бесприютная","бесприютность","бесприютный","беспросветность","беспутица","беспутник","беспутница","беспутность","беспутство","беспутье","бессвязность","бессемейная","бессемейный","бессемерование","бессемянка","бессердечие","бессердечность","бессилие","бессистемность","бесславие","бесславность","бессловесная","бессловесность","бессловесные","бессловесный","бессменность","бессмертие","бессмертная","бессмертник","бессмертность","бессмертный","бессмысленность","бессмыслие","бессмыслица","бесснежие","бессовестная","бессовестность","бессовестный","бессодержательность","бессознательное","бессознательность","бессонница","бессословность","бесспорность","бессребреник","бессребреница","бессрочность","бесстрастие","бесстрастность","бесстрашие","бесстрашная","бесстрашный","бесстыдник","бесстыдница","бесстыдность","бесстыдный","бесстыдство","бесстыжая","бесстыжий","бессубъектность","бессюжетность","бестактность","бесталанность","бесталантность","бестелесность","бестер","бестия","бестоварье","бестолковость","бестолковщина","бестолочь","бестселлер","бестужевка","бестягольный","бесформенность","бесхарактерная","бесхарактерность","бесхарактерный","бесхвостые","бесхитростность","бесхлебица","бесхлебье","бесхозяйственность","бесхозяйствие","бесхребетность","бесцветность","бесцельность","бесцензурность","бесценность","бесцеремонность","бесчеловечие","бесчеловечность","бесчестность","бесчестье","бесчинник","бесчинница","бесчинство","бесчисленность","бесчувственность","бесчувствие","бесшабашность","бесшумность","бета","бета-лучи","бета-распад","бета-терапия","бетатрон","бетатронщик","бета-частица","бета-частицы","бетель","бетон","бетонирование","бетонировка","бетонка","бетоновоз","бетономешалка","бетоносмеситель","бетоноукладчик","бетонщик","бетонщица","бетоньерка","бефстроганов","бечева","бечевая","бечёвка","бечевник","бечёвочка","бешамель","бешбармак","бешеная","бешенство","бешеный","бешмет","бзик","биатлон","биатлонист","биатлонистка","бибабо","бибколлектор","библиограф","библиографирование","библиография","библиолог","библиология","библиоман","библиомания","библиотека","библиотека-передвижка","библиотекарша","библиотекарь","библиотека-читальня","библиотековед","библиотековедение","библиотечка","библиофил","библиофильство","Библия","бивак","бивень","бивни","бивуак","бигуди","бидон","бидончик","биение","биения","бижутерия","бизань","бизань-мачта","бизнес","бизнесмен","бизнесменство","бизон","бикини","бикс","билабиальный","билет","билетёр","билетёрша","билетик","билингв","билингвизм","билирубин","биллон","билль","било","бильбоке","бильярд","бильярдист","бильярдная","биметалл","биметаллизм","бимс","биндюжник","бинокль","бинокулярность","бином","бинт","бинтик","бинтование","бинтовка","биоархитектура","биобиблиография","биогеография","биогеоценоз","биогеоценология","биограф","биография","биокибернетик","биокибернетика","биокрем","биолит","биолиты","биолог","биологичка","биология","биомасса","биомеханика","биомицин","бионик","бионика","биополимер","биополимеры","биопотенциал","биопсия","биоритм","биоритмы","биосинтез","биостанция","биостимулятор","биосфера","биотелеметрия","биотоки","биотопливо","биофизик","биофизика","биохимик","биохимия","биохроника","биоценоз","биоценология","биоэнергетика","биплан","биржа","биржевик","бирка","бирманец","бирманка","бирманцы","бирочка","бирюза","бирюк","бирюлька","бирюльки","бирюч","бирючина","бис","бисер","бисерина","бисеринка","бисквит","бисквиты","биссектриса","бистро","бит","бита","битва","битки","битник","биток","биточек","биточки","битум","битумовоз","битый","битьё","битюг","бифуркация","бифштекс","бицепс","бициллин","бич","бичевание","блага","благо","благоверная","благоверный","благовест","Благовещение","благоволение","благовоние","благовония","благовоспитанность","благоглупость","благоговение","благодарение","благодарность","благодать","благоденствие","благодетель","благодетельница","благодеяние","благодушие","благое","благожелатель","благожелательница","благожелательность","благожелательство","благозвучие","благозвучность","благолепие","благонадёжность","благонамеренность","благонравие","благонравность","благообразие","благопожелание","благополучие","благоприобретение","благоприобретенное","благопристойность","благоприятность","благоприятствование","благоразумие","благоразумность","благорасположение","благорастворение","благородие","благородная","благородный","благородство","благосклонность","благословение","благосостояние","благостыня","благость","благотворение","благотворитель","благотворительница","благотворительность","благотворность","благоусмотрение","благоустроенность","благоустройство","благоухание","благочестие","благочиние","благочинный","блаженная","блаженненькая","блаженненький","блаженный","блаженство","блажь","блайзер","бланк","бланковка","бланманже","бланширование","бланшировка","бластома","бластула","блат","блатмейстер","блатная","блатной","блато","блевота","блевотина","бледнолицый","бледность","блейзер","блёклость","блеск","блески","блесна","блёстка","блёстки","блёсточка","блёсточки","блеф","блеяние","ближние","ближний","близкие","близкое","Близнец","близнец","близнецы","Близнецы","близнята","близорукая","близорукий","близорукость","близость","близь","блик","блин","блиндаж","блиндажик","блиндирование","блинец","блинки","блинная","блинник","блинница","блинок","блинт","блинцы","блинчик","блинчики","блины","блистание","блистательность","блистер","блиц","блицкриг","блок","блокада","блокадник","блокадница","блокгауз","блокирование","блокировка","блок-комната","блок-корпус","блокнот","блокнотик","блоковый","блокпост","блок-секция","блонда","блондин","блондинка","блондиночка","блондинчик","блонды","блоха","блошка","блуд","блудливость","блудни","блудник","блудница","блудня","блуждание","блуза","блузка","блузник","блузочка","блюдечко","блюдо","блюдолиз","блюдце","блюз","блюм","блюминг","блюститель","блюстительница","блямба","бляха","бляшка","бляшки","боа","боб","бобёр","бобик","бобина","бобо","бобовник","бобовые","бобок","бобочка","бобр","бобрёнок","бобрик","бобриха","бобслей","бобслеист","бобы","бобылка","бобыль","бог","Бог","богаделка","богадельня","богара","богатая","богатей","богатейка","богатство","богатый","богатырство","богатырша","богатырь","богач","богачка","богдыхан","богема","богиня","богоборец","богоборчество","богобоязненность","богоискатель","богоискательство","богомаз","Богоматерь","богомил","богомильство","богомол","богомолец","богомолка","богомолы","богомолье","богоотступник","богоотступница","Богородица","богослов","богословие","богослужение","богостроитель","богостроительство","богохульник","богохульница","богохульство","бодание","бодибилдинг","бодливость","бодрость","бодрствование","бодряк","бодрячество","бодрячок","бодяга","бодяк","боевик","боевитость","боеголовка","боеготовность","боезапас","боезаряд","боёк","боекомплект","боеприпасы","боеспособность","боец","божба","Боженька","божеское","божественное","божественность","божество","божница","божок","бой","бой-баба","бой-девка","бойкий","бойкость","бойкот","бойкотист","бойлер","бойлерная","бойница","бойня","бойскаут","бойскаутизм","бок","бокал","бокальчик","боковина","боковинка","боковушка","бокс","боксёр","боксёрка","боксёрки","боксит","болван","болванка","болванчик","болвашка","болгарин","болгарка","болгары","болезненность","болезнь","болельщик","болельщица","болеро","боливар","боливиец","боливийка","боливийцы","болиголов","болид","болометр","болона","болонка","болонья","болотина","болотинка","болотник","болото","болотовед","болотоведение","болотоход","болотце","болт","болтание","болтанка","болтик","болтливость","болтовня","болтология","болтун","болтунишка","болтунья","болтушка","боль","больная","больница","больничка","больничный","больное","больной","большак","большевизм","большевик","большевичка","большегруз","большее","большинство","большое","большой","большуха","болячка","болящая","болящий","бомба","бомбарда","бомбардир","бомбардирование","бомбардировка","бомбардировщик","бомбёжка","бомбовоз","бомбодержатель","бомбомёт","бомбометание","бомбометатель","бомбоубежище","бомбочка","бомж","бомонд","бон","бона","бонапартизм","бонапартист","бонбоньерка","бонвиван","бондарня","бондарство","бондарь","бонза","бонитет","бонитировка","бонмо","бонмотист","бонна","бонтон","боны","бор","бора","боргес","бордель","бордеро","бордо","бордюр","бордюрчик","борей","борение","борец","боржом","боржоми","борзая","борзописец","борзый","борзятник","бормашина","бормотание","бормотун","бормотунья","бормотуха","боров","боровик","боровинка","боровичок","борода","бородавка","бородавочка","бородач","бородёнка","бородища","бородка","бородушка","борозда","бороздка","бороздник","бороздование","бороздочка","борок","борона","боронильщик","боронильщица","боронка","бороновальщик","бороновальщица","боронование","бороновка","бороньба","борт","бортжурнал","бортик","бортинженер","бортмеханик","бортник","бортничество","бортовка","бортовщик","бортпаёк","бортпроводник","бортпроводница","борть","борцовка","борцовки","борщ","борщевик","борщок","борьба","боскет","боскетная","босниец","боснийка","боснийцы","босовик","босовики","босоножка","босоножки","босота","босс","бостон","босяк","босячество","бот","ботало","ботанизирка","ботаник","ботаника","ботаничка","ботва","ботвинья","ботдек","ботик","ботики","ботинки","ботинок","ботиночек","ботиночки","ботник","ботулизм","ботфорт","ботфорты","боты","боцман","боцманмат","бочаг","бочажок","бочар","бочечка","бочка","бочки","бочковатость","бочкотара","бочок","бочонок","боязливая","боязливость","боязливый","боязнь","боярин","боярин-дворецкий","боярка","боярство","боярщина","боярыня","боярышник","боярышница","боярышня","бра","брабансон","бравада","бравирование","браво","бравость","бравура","бравурность","брага","брада","брадикардия","брадобрей","бражка","бражник","бражники","бражничание","бражничество","бразда","бразды","бразилец","бразильцы","бразильянец","бразильянка","брак","бракёр","бракераж","браковка","браковщик","браковщица","бракодел","бракодельство","браконьер","браконьерство","бракосочетавшаяся","бракосочетавшиеся","бракосочетавшийся","бракосочетание","браман","браманизм","брамин","брамсель","брандахлыст","брандвахта","брандер","брандмайор","брандмауэр","брандмейстер","брандспойт","брань","брас","браслет","браслетик","браслетка","браслеты","брасс","брассист","брассистка","брат","братан","братание","братва","брательник","братец","братик","братина","братишка","братия","браток","братоубийство","братоубийца","братство","братушка","братчина","братья","браунинг","брахицефал","брахицефалия","брахман","брахманизм","брачующаяся","брачующиеся","брачующийся","брашна","брашно","брашпиль","бревешко","бревёшко","бревно","бревнотаска","брёвнышко","брег","брегет","бред","бредень","бредни","брезгливец","брезгливица","брезгливость","брезгун","брезгунья","брезгуша","брезент","брезентовка","брейд-вымпел","брекватер","брекчия","брелок","брелочек","бремсберг","бремя","бренди","бренность","бренчание","бренькание","бретели","бретель","бретелька","бретельки","бретёр","бретонец","бретонка","бретонцы","брёх","брехня","брехун","брехунья","брешь","бриг","бригада","бригадир","бригадирство","бригадирша","бригадник","бригадница","бригантина","бридж","бриджи","бриз","брика","брикет","брикетирование","бриллиант","бриллиантик","бриллиантин","бриллиантщик","бриль","брильянт","брильянтик","брильянтин","брильянтщик","бриолин","бриошь","британец","британка","британцы","бритва","бритт","бритты","бритьё","брифинг","бричка","бровка","бровь","брод","бродень","бродильня","бродни","бродяга","бродяжество","бродяжка","бродяжничество","брожение","бройлер","брокат","брокер","бром","бромид","бронеавтомобиль","бронебойка","бронебойщик","броневик","бронекатер","бронеколпак","бронемашина","броненосец","броненосцы","бронепоезд","бронесилы","бронеспинка","бронестекло","бронетранспортёр","бронза","бронзирование","бронзировка","бронзовка","бронзовщик","бронирование","бронник","бронтозавр","бронх","бронхи","бронхиола","бронхиолы","бронхит","бронхография","бронхопневмония","бронхоскопия","броня","бросание","броскость","бросок","брошка","брошь","брошюра","брошюрка","брошюрование","брошюровка","брошюровочная","брошюровщик","брошюровщица","брудер","брудерация","брудергауз","брульон","брус","брусника","брусница","брусничка","брусничник","брусничные","брусовка","брусок","брусочек","брусочник","бруствер","брусчатка","брусчатник","брусья","бруцеллёз","бруцеллёзная","бруцеллёзный","брыжейка","брыжи","брызгалка","брызгало","брызгание","брызги","брызгун","брыкание","брыкливость","брыкун","брыла","брылы","брынза","брюзга","брюзгливость","брюзглость","брюзжание","брюква","брюквенница","брюквина","брюки","брюки-гольфы","брюковка","брюнет","брюнетка","брюнеточка","брюхан","брюхач","брюхо","брюховина","брюхоногие","брючина","брючишки","брючки","брючник","брючонки","брюшина","брюшко","брюшняк","бряк","брякание","бряцание","бубен","бубенец","бубенчик","буби","бублик","бубличек","бубличник","бубличница","бубна","бубновка","бубны","бубон","бугай","бугель","бугенвиллея","буги-вуги","бугор","бугорок","бугорочек","бугорчатка","бугристость","будара","бударка","буддизм","буддист","буддистка","будёновец","будёновка","будильник","будирование","будка","будни","будничность","будорага","будочка","будочник","будра","будуар","будущее","будущность","будыль","будяк","буёк","буер","буерак","буерист","буж","буженина","буженинка","буза","бузила","бузина","бузинник","бузотёр","бузотёрка","бузотёрство","буй","буйвол","буйволёнок","буйволица","буйность","буйреп","буйство","бук","бука","букан","букашечка","букашка","буква","буквализм","буквалист","буквалистика","буквальность","букварик","букварь","буквица","буквоед","буквоедка","буквоедство","буквочка","букет","букетец","букетик","букетировка","букетище","буки","букинист","букле","буклет","букли","букля","букмекер","буковка","буковые","буколика","буколька","букольки","букс","букса","буксир","буксирование","буксировка","буксировщик","буксирчик","буксование","буксовка","булава","булавка","булавочка","булавочник","булавочница","буланая","буланка","буланый","булат","булга","булка","булла","булочка","булочная","булочник","булочница","бултыхание","булыга","булыжина","булыжник","бульвар","бульварчик","бульварщина","бульдог","бульдозер","бульдозерист","булькание","бульон","бульончик","бум","бумага","бумаги","бумагомарака","бумагомарание","бумагомаратель","бумагопрядение","бумагопрядильня","бумаготворчество","бумаженция","бумажечка","бумажка","бумажник","бумажонка","бумазейка","бумазея","бумеранг","бунгало","бунд","бундесвер","бундесрат","бундестаг","бундовец","бункер","бункеровка","бункеровщик","бунт","бунтарка","бунтарство","бунтарь","бунтовство","бунтовщик","бунтовщица","бунчужный","бунчук","бур","бура","бурав","буравчик","бурак","бураки","буран","бурат","бурачник","бурачниковые","бурачок","бурбон","бург","бургомистр","бургонское","бурда","бурдюк","буревал","буревестник","бурелом","буреломник","бурение","бурёнка","бурёнушка","буржуа","буржуазия","буржуазность","буржуй","буржуйка","бурильщик","бурильщица","буриме","бурка","буркалы","буркание","бурки","бурлак","бурлачество","бурление","бурлеск","бурлеска","бурливость","бурмастер","бурмистр","бурнус","бурнусик","буровая","буровик","бурозём","бурозубка","бурса","бурсак","бурсит","бурт","буртование","буртоукладчик","бурун","бурундук","бурундучиха","бурундучок","бурундучонок","буруны","бурчание","бурш","бурщик","бурщица","буры","бурьян","буря","бурят","бурятка","бурят-монгол","бурят-монголка","бурят-монголы","буряты","бус","бусина","бусинка","буссоль","бустер","бусы","бут","бутада","бутадиен","бутан","бутара","бутафор","бутафория","бутафорская","бутерброд","бутербродец","бутербродик","бутирометр","бутон","бутонизация","бутончик","бутоньерка","бутса","бутсы","бутуз","бутузик","бутылка","бутылконос","бутылочка","бутыль","буфер","буфет","буфетец","буфетик","буфетная","буфетчик","буфетчица","буфф","буффон","буффонада","буффонство","буфы","бухание","буханка","буханочка","бухарник","бухгалтер","бухгалтерия","бухгалтерша","бухта","бухточка","буцефал","буча","бучение","бучило","бушевание","бушель","бушлат","бушмен","бушменка","бушмены","бушприт","буян","буянство","бывалая","бывалец","бывалое","бывалость","бывалый","бывальщина","быдло","бык","быки","былина","былинка","былиночка","былинушка","былка","былое","быль","быльё","быльник","быстрина","быстродействие","быстрота","быстротечность","быстроток","быстроходность","быстряк","быстрянка","быт","бытие","бытность","бытование","бытовизм","бытовик","бытовка","бытовщина","бытописание","бытописатель","бытописательство","бытьё","бычатина","бычина","бычище","бычки","бычок","бычонок","бьеф","бэр","бювар","бювет","бюджет","бюкса","бюллетень","бюргер","бюргерство","бюргерша","бюретка","бюро","бюрократ","бюрократизация","бюрократизм","бюрократия","бюрократка","бюст","бюстгальтер","бюстик","бязь","бяка","вабик","вабильщик","Вавилон","вавилоны","вавилоняне","вавилонянин","вавилонянка","вага","вагант","ваганты","вагон","вагонетка","вагонетчик","вагонетчица","вагонка","вагонник","вагоновожатая","вагоновожатый","вагоноопрокидыватель","вагоностроение","вагон-ресторан","вагончик","вагонщик","вагранка","вагранщик","ваер","важ","важа","важенка","важи","важничание","важное","важность","ваза","вазелин","вазомоторы","вазон","вазопись","вазочка","вайя","вак","вакса","вакуоли","вакуоль","вакуум","вакуумирование","вакуумметр","вакуумщик","вакуумщица","Вакх","вакханалия","вакханка","вакцина","вакцинация","вакцинотерапия","вал","валансьен","валах","валахи","валашка","валеж","валежина","валежник","валёк","валенец","валенки","валенок","валеночек","валеночки","валентность","валенцы","валёр","валериана","валерьяна","валерьянка","валет","валец","валидол","вализа","валик","валка","валки","валкование","валкователь","валкость","валлон","валлонка","валлоны","валок","валокордин","валторна","валторнист","валуй","валун","валух","валушок","вальдшнеп","валькирии","валькирия","вальс","вальтрап","вальцевание","вальцовка","вальцовщик","вальцовщица","вальцы","вальщик","вальяжность","валюта","валютчик","валютчица","валяльня","валяльщик","валяльщица","валяние","вамп","вампир","ванадий","вандал","вандализм","вандалы","ванилин","ваниль","ванна","ванная","ванночка","ванны","ванта","ванты","ванька-встанька","вар","варакушка","варан","варвар","варваризм","варварство","варево","варега","вареги","варежка","варежки","варенец","варение","вареник","вареники","вареничная","варёное","варенье","вареньице","вариабельность","вариант","вариантность","вариативность","вариатор","вариации","вариация","варильщик","варильщица","вариометр","вариоскопия","варка","варнак","варначка","варок","варшавянка","варщик","варщица","варьете","варьирование","варяг","варяги","василёк","василёчек","василиск","вассал","вассальство","вата","ватага","ватажка","ватажник","ватажок","ватерлиния","ватерпас","ватерполист","ватерполистка","ватерполо","ватин","ватка","ватман","ватник","ватрушечка","ватрушка","ватт","ваттметр","ватт-час","вафелька","вафельница","вафельщик","вафельщица","вафля","вахлак","вахлачка","вахмистр","вахта","вахтенный","вахтер","вахтёр","вахтёрка","вахтерша","вахтёрша","ваш","ваша","вашгерд","ваше","ваши","ваяние","ваятель","вбивание","вбирание","вбрасывание","вваривание","вварка","введение","ввёртывание","ввивание","ввинчивание","ввод","ввоз","вволакивание","ввязка","ввязывание","вгиб","вгибание","вглядывание","вгон","вгрызание","вдавление","вдавленность","вдавливание","вдавлина","вдавлинка","вдалбливание","вдвигание","вдевание","вделка","вделывание","вдёргивание","вдёржка","вдова","вдовая","вдовец","вдовица","вдовка","вдовство","вдовствование","вдовуха","вдовушка","вдовые","вдовый","вдох","вдохновение","вдохновенность","вдохновитель","вдохновительница","вдувание","вдумчивость","вдыхание","вегетарианец","вегетарианка","вегетарианство","вегетация","веда","ведение","ведёрко","ведерница","ведёрница","ведёрочко","ведёрце","ведёрышко","веди","ведомая","ведомостичка","ведомость","ведомственность","ведомство","ведро","вёдро","ведун","ведунья","ведущая","ведущий","веды","ведьма","ведьмак","ведьмовство","веер","веерок","вежа","вежда","вежды","Вездесущий","вездеход","вездеходка","вездеходчик","везение","везучесть","век","веки","веко","вековуха","вековуша","вековушка","векселедатель","векселедержатель","вексель","вектор","векторметр","векша","веление","велеречивость","велеречие","великан","великанша","великий","великодушие","великодушничание","великое","великолепие","великомученик","великомученица","великоросс","великоросска","великороссы","великорус","великоруска","великорусы","величавость","величальная","величание","величественность","величество","величие","величина","велобол","велогонка","велогонщик","велогонщица","велодром","велорикша","велосипед","велосипедист","велосипедистка","велоспорт","велотрек","вельбот","вельвет","Вельзевул","вельможа","вельможество","вельможность","велюр","вена","венгерец","венгерка","венгерское","венгерцы","венгр","венгры","вендетта","венды","венеды","Венера","венеролог","венерология","венесуэлец","венесуэлка","венесуэльцы","венеты","венец","вензель","веник","веничек","вено","венок","веночек","вентерщик","вентерь","вентилирование","вентиль","вентилятор","вентиляция","венценосец","венчание","венчик","вены","вепрь","вепс","вепсы","вера","веранда","верба","вербена","вербеновые","верблюд","верблюдица","верблюдка","верблюжатина","верблюжатник","верблюжина","верблюжонок","Вербная","вербняк","вербование","вербованная","вербованный","вербовка","вербовщик","вербовщица","вербочка","вервь","вердикт","верёвка","верёвочка","верёвочник","веред","верезг","верезжание","верейка","вереница","верес","вереск","вересковые","веретеница","веретено","веретёнце","веретье","веретьё","верещание","верещатник","верея","верзила","верига","вериги","верификация","верк","верки","верлибр","вермишель","вермут","вернисаж","верноподданная","верноподданность","верноподданный","верноподданство","верность","верняк","верование","верования","вероисповедание","вероломец","вероломность","вероломство","вероника","вероотступник","вероотступница","вероотступничество","веротерпимость","вероучение","вероятность","версификатор","версификаторство","версификация","версия","верста","верстак","верстальщик","верстание","верстатка","верстачок","вёрстка","верстомер","вертел","вертеп","вертикал","вертикаль","вертикальность","вертихвостка","вёрткость","вертлуг","вертлюг","вертлявость","вертоград","вертоградарь","вертодром","вертолёт","вертолётоносец","вертолётостроение","вертолётчик","вертолётчица","вертопрах","вертун","вертунья","вертушка","вертячка","вертячки","верующая","верующий","верфь","верх","верха","верхи","верховенство","верховод","верховодка","верховой","верховье","верхогляд","верхоглядка","верхоглядство","верхоконный","верхолаз","верхотура","верхушечка","верхушка","верчение","верша","вершение","вершина","вершинка","вершинник","вершитель","вершительница","вершки","вершок","вершочек","вес","весёлка","весёлко","весёлое","весёлость","веселье","весельце","весельчак","вескость","весло","веслоногие","весна","весновспашка","веснушка","веснушки","веснушчатость","веснянка","веснянки","весовая","весовщик","весовщица","весок","весомость","весочки","вест","весталка","вестготы","вестерн","вестибюль","вестка","вестник","вестница","вестовой","весточка","весть","Весы","весы","весь","ветвистость","ветвление","ветврач","ветвь","ветер","ветеран","ветеранка","ветеринар","ветеринария","ветерок","ветерочек","ветка","ветла","вето","веточка","ветошка","ветошник","ветошница","ветошничество","ветошь","ветр","ветреник","ветреница","ветреность","ветрило","ветрище","ветровал","ветровка","ветрогон","ветрогонка","ветродвигатель","ветролом","ветростанция","ветроэнергетика","ветры","ветряк","ветрянка","ветфельдшер","ветхозаветность","ветхость","ветчина","ветчинка","вех","веха","вехи","вече","вечер","вечеринка","вечёрка","вечерник","вечерня","вечерок","вечерочек","вечеря","вечность","вешала","вешалка","вешало","вешание","вешатель","вешка","вешняк","вещание","вещее","вещественность","вещество","вещи","вещизм","вещица","вещичка","вещмешок","вещун","вещунья","вещь","веялка","веяльщик","веяльщица","веяние","вжатие","вживание","вживление","вжикание","вжимание","взаимность","взаимовлияние","взаимовыгодность","взаимовыручка","взаимодействие","взаимодополняемость","взаимозависимость","взаимозаменяемость","взаимоконтроль","взаимообмен","взаимообогащение","взаимообусловленность","взаимоответственность","взаимоотношение","взаимоотношения","взаимоподдержка","взаимопомощь","взаимопонимание","взаимопроверка","взаимопроникновение","взаиморасположение","взаиморасчёты","взаимосвязанность","взаимосвязь","взаимоуважение","взбалмошность","взбалтывание","взбег","взбегание","взбивание","взблеск","взблескивание","взбрасывание","взброс","взбрызгивание","взбрык","взбрыкивание","взбухание","взбучка","взваливание","взвар","взварец","взвевание","взведение","взвесь","взвешивание","взвивание","взвизг","взвизгивание","взвинченность","взвинчивание","взвод","взводный","взволакивание","взволнованность","взволок","взворачивание","взвывание","взгляд","взгорбок","взгорок","взгорочек","взгорье","вздваивание","вздёргивание","вздёржка","вздор","вздорность","вздорожание","вздоры","вздох","вздрагивание","вздрючка","вздувание","вздутие","вздутость","вздымание","вздыхание","вздыхатель","взимание","взламывание","взлезание","взлёт","взлетание","взлизина","взлобок","взлом","взломщик","взлохмачивание","взмах","взмахивание","взмёт","взморье","взмучивание","взмыв","взнос","взнуздывание","взор","взрачность","взращивание","взрез","взрезывание","взрослая","взросление","взрослость","взрослый","взрыв","взрывание","взрыватель","взрывник","взрывоопасность","взрывчатка","взрывчатость","взрыд","взрыхление","взъезд","взъерошивание","взывание","взыск","взыскание","взыскательность","взыскивание","взятие","взятка","взяткодатель","взяткодательство","взяткополучатель","взяток","взяточник","взяточница","взяточничество","виадук","вибратор","вибрация","вибрион","вибрионы","вибрирование","вибробезопасность","виброболезнь","виброзащита","виброизолятор","виброизоляция","виброметр","виброметрия","вибромолот","вибропогружатель","вибропрокат","вибростенд","виброустойчивость","виварий","виверра","вивианит","вивисектор","вивисекция","виг","вигвам","виги","вигонь","вид","видение","виденное","видео","видеозапись","видеоинформация","видеокамера","видеокассета","видеолента","видеомагнитофон","видеоплёнка","видеосвязь","видеосигнал","видеотелефон","видеотерминал","видеофильм","видик","видимое","видимость","видоизменение","видоизменяемость","видоискатель","видок","видообразование","виды","виза","визави","визаж","визажист","византинист","византинистика","византиноведение","византолог","визг","визгливость","визготня","визгун","визгунья","визжание","визига","визир","визирование","визировка","визирь","визит","визитация","визитёр","визитка","вика","викарий","викинг","виконт","виконтесса","викторина","виктория","виктория-регия","вилайет","вилка","вилла","виллан","вилок","вилочка","вилы","виляние","вина","виндсёрфинг","винегрет","вини","винишко","винище","винкель","винница","вино","виноватая","виноватость","виноватый","виновная","виновник","виновница","виновность","виновный","виноград","виноградарство","виноградарь","виноградина","виноградинка","виноградник","виноградовые","виноградолечение","винодел","виноделие","винодельня","винокур","винокурение","винокурня","винотека","виноторговец","виноторговля","виночерпий","винт","винтёр","винтик","винтовка","винтовочка","винтокрыл","винторез","винцо","винчестер","виньет","виньета","виньетка","виола","виолончелист","виолончелистка","виолончель","вира","вираж","вирирование","виртуальность","виртуоз","виртуозка","виртуозность","вирулентность","вирус","вирусолог","вирусология","вирусоноситель","вирусы","вирша","виршеписец","виршеплёт","виршеплётство","вирши","вис","виселица","висельник","висение","виски","вискоза","вискозиметр","вискозиметрия","висмут","висмутин","висок","високос","височек","височки","виссон","вист","висюлька","витализм","виталист","витамин","витаминизация","витаминизирование","витаминность","витаминозность","витаминология","витаминотерапия","витамины","витание","витиеватость","витийство","вития","виток","витраж","витражист","витрина","витушка","витьё","витютень","витязь","вихор","вихорок","вихорчик","вихреобразование","вихры","вихрь","вице-адмирал","вице-губернатор","вице-канцлер","вице-консул","вице-король","вице-президент","вицмундир","вишенка","вишенник","вишенье","вишнёвка","вишнёвочка","вишня","вишняк","вкатывание","вкачивание","вкидывание","вклад","вкладка","вкладчик","вкладчица","вкладывание","вкладыш","вклеивание","вклейка","вклёпка","вклёпывание","вклинение","вклинивание","включение","включения","включённость","вковывание","вколачивание","вкоренение","вкрадчивость","вкрапина","вкрапление","вкрапления","вкрапленник","вкрапленники","вкрапливание","вкручивание","вкус","вкусности","вкусность","вкуснота","вкуснотища","вкуснятина","вкусовщина","вкушение","влага","влагалище","влагомер","влагостойкость","владелец","владелица","владение","владения","владетель","владетельница","владимирка","владыка","владычество","владычица","влажность","влас","властвование","властелин","власти","властитель","властительница","властность","властолюбец","властолюбие","власть","власы","власяница","влезание","влёт","влетание","влечение","вливание","влияние","влиятельность","вложение","вложения","влюбление","влюблённая","влюблённость","влюблённый","влюбчивость","вмазка","вмазывание","вменение","вменяемость","вместилище","вместимость","вместительность","вмешательство","вмешивание","вминание","вмятина","вмятинка","вмятость","внедрение","внезапность","внеочерёдность","внеплановость","внесение","внешнее","внешность","внимание","внимательность","вноска","внук","внука","внуки","внутренности","внутренность","внучата","внучек","внученька","внучка","внучок","внучонок","внушаемость","внушение","внушительность","внятность","вобла","вовлекание","вовлечение","вогнутость","вогул","вогулка","вогулы","вода","водворение","водевилист","водевиль","водитель","водительница","водительство","водица","водичка","водка","водник","воднолыжник","воднолыжница","водность","водобой","водобоязнь","водоверть","водовод","водовоз","водовозка","водоворот","водогрей","водогрейка","водогрейня","водогрязелечебница","водоём","водозабор","водоизмещение","водокачка","водолаз","водолазка","Водолей","водолей","водолечебница","водолечение","водолив","водолюб","водомер","водомерка","водомёт","водомоина","водонагреватель","водонепроницаемость","водонос","водоноска","водоносность","водоотвод","водоотлив","водоочиститель","водоочистка","водопад","водоплавка","водоподъёмник","водопой","водопойка","водополица","водополь","водополье","водопользование","водоприёмник","водопровод","водопроводчик","водопроницаемость","водораздел","водораспыление","водораспылитель","водорез","водород","водоросли","водоросль","водосбор","водосборник","водосброс","водосвятие","водоскат","водослив","водоснабжение","водоспуск","водостойкость","водосток","водоток","водоупорность","водоустойчивость","водохлёб","водохранилище","водочерпалка","водочка","водружение","воды","водь","водяная","водяник","водяника","водянистость","водяница","водянка","водяной","воевода","воеводство","военачальник","военизация","военком","военкомат","военкор","военное","военнообязанная","военнообязанный","военнопленная","военнопленный","военнослужащая","военнослужащий","военный","военрук","военспец","военторг","военщина","вожак","вожатая","вожатый","вожделение","вожделенная","вожделенный","вождение","вождизм","вождь","вожжа","вожжи","воз","возбудимость","возбудитель","возбуждаемость","возбуждение","возбуждённость","возведение","возвеличение","возвеличивание","возвещение","возврат","возвращение","возвышение","возвышенное","возвышенность","возвышеньице","возглавие","возглас","возглашение","возгонка","возгораемость","возгорание","воздаяние","Воздвижение","воздвижение","воздевание","воздействие","возделывание","возделыватель","воздержавшаяся","воздержавшийся","воздержание","воздержанность","воздержность","воздух","воздуховод","воздуходув","воздуходувки","воздухозаборник","воздухонагреватель","воздухонепроницаемость","воздухообмен","воздухоохладитель","воздухоочиститель","воздухоплавание","воздухоплаватель","воздухоплавательница","воздухоподогреватель","воздухопровод","воздухопроницаемость","воздушка","воздушник","воздушность","воздыхание","воздыхатель","воздыхательница","возжелание","возжигание","воззвание","воззрение","возик","возишко","возище","возка","возлежание","возлияние","возложение","возлюбленная","возлюбленный","возмездие","возмещение","возможное","возможности","возможность","возмужалость","возмужание","возмутитель","возмутительница","возмутительность","возмущение","вознаграждение","Вознесение","вознесение","возникновение","возница","возничий","возношение","возня","возобновление","возок","возражатель","возражательница","возражение","возраст","возрастание","возрасты","Возрождение","возрождение","возчик","вой","войлок","войлочек","воин","война","воинственность","воинство","войска","войско","войт","воитель","воительница","вокабула","вокабулярий","вокал","вокализ","вокализация","вокализм","вокалист","вокалистка","вокзал","вокзальчик","вол","волан","волапюк","волга","волгарь","волглость","волдырь","волейбол","волейболист","волейболистка","волеизъявление","волжане","волжанин","волжанка","волк","волкодав","волна","волнение","волнения","волнистость","волновод","волнограф","волнолом","волномер","волнообразование","волнорез","волнуха","волнушка","волны","волнянка","воловик","воловина","воловня","волок","волокита","волокитство","волокитчик","волокнистость","волокнит","волокно","волоконце","волокуша","волонтёр","волонтёрка","волос","волосатик","волосатость","волосёнки","волосик","волосина","волосинка","волосищи","волоски","волосня","волосовина","волосок","волосочек","волость","волосы","волосянка","волочение","волочильня","волочильщик","волхв","волхвование","волчанка","волчатник","волчец","волчиха","волчица","волчище","волчок","волчонок","волшебник","волшебница","волшебство","волынка","волынщик","вольвокс","вольер","вольера","вольная","вольница","вольнодум","вольнодумец","вольнодумие","вольнодумство","вольномыслие","вольнонаёмная","вольнонаёмный","вольноопределяющийся","вольноотпущенная","вольноотпущенник","вольноотпущенный","вольнослушатель","вольнослушательница","вольность","вольный","вольт","вольта","вольтаж","вольтаметр","вольт-ампер","вольтерьянец","вольтерьянство","вольтижёр","вольтижёрка","вольтижирование","вольтижировка","вольтметр","вольфрам","вольфрамит","волюнтаризм","волюнтарист","волюнтаристка","волюта","волюшка","воля","вона","вонища","вонь","вонючка","воображаемое","воображала","воображение","воображуля","воодушевление","вооруженец","вооружение","вооружённость","вопленица","вопли","воплотитель","воплотительница","воплощение","вопль","вопрос","вопросец","вопросик","вопросник","вопрошание","вопрошатель","вопрошательница","вопрошение","вор","ворвань","воришка","ворище","воркование","воркотание","воркотня","воркотун","воркотунья","воркун","воркунья","воробей","воробейник","воробейчик","воробушек","воробышек","воробьевит","воробьёнок","воробьиные","воробьиха","воробьишка","ворованное","вороватость","воровка","воровство","ворог","ворожба","ворожей","ворожейка","ворожея","ворожка","ворократия","ворон","ворона","вороная","воронение","воронёнок","воронец","вороника","воронильщик","ворониха","воронка","воронко","вороновые","вороной","вороночка","воронь","вороньё","ворот","ворота","воротила","воротило","воротища","воротник","воротничок","вороток","воротца","ворох","ворочание","ворошение","ворошилка","ворс","ворсильня","ворсильщик","ворсина","ворсинка","ворсистость","ворсовальня","ворсование","ворсовка","ворсовщик","ворсянка","ворсянковые","ворчание","ворчливость","ворчун","ворчунья","ворьё","ворюга","восемнадцатая","восемнадцатилетие","восемнадцатый","воск","воскликновение","восклицание","воскобой","воскобойная","воскобойня","восковка","восколей","воскормленец","воскормление","воскормленник","воскормленница","воскресение","воскресенье","воскреситель","воскресительница","воскресник","воскрешение","воскурение","воспаление","воспарение","воспевание","воспеватель","воспитание","воспитанник","воспитанница","воспитанность","воспитатель","воспитательница","воспламенение","воспламеняемость","восполнение","воспоминание","воспоминания","воспрепятствование","воспрещение","восприемлемость","восприемник","восприемница","восприимчивость","воспринимаемость","воспринятие","восприятие","воспроизведение","воспроизводитель","воспроизводительница","воспроизводство","воссоединение","воссоздание","восстание","восстановитель","восстановление","восток","Восток","востоковед","востоковедение","восторг","восторженность","восточник","востребование","востриё","воструха","вострушка","восхваление","восхитительность","восхищение","восход","восходитель","восходящая","восхождение","восшествие","восьмая","восьмерик","восьмёрка","восьмидесятая","восьмидесятилетие","восьмидесятник","восьмидесятники","восьмидесятница","восьмидесятый","восьмиклассник","восьмиклассница","восьмилетие","восьмилетка","восьмилеток","восьмисотая","восьмисотлетие","восьмисотый","восьмитысячная","восьмитысячный","восьмиугольник","восьмичасовой","восьмой","восьмушка","вотирование","вотировка","вотум","вотчина","вотчинник","вотяк","вотяки","вотячка","воцарение","вошедшая","вошедший","вошка","вошь","вощанка","вощение","вощина","вояж","вояжёр","вояжировка","вояка","впадение","впадина","впадинка","впаивание","впайка","впайщик","впалость","вперёдсмотрящий","вперение","впечатление","впечатленьице","впечатлительность","впечатляемость","впечатывание","впивание","вписка","вписывание","впитывание","впихивание","вплетание","вползание","вправление","впрессовка","впрессовывание","впрыгивание","впрыск","впрыскивание","впрягание","впуск","впускание","впутывание","впяливание","впячивание","врабатывание","враг","врагиня","вражда","враждебность","враждование","вражина","вразумительность","вразумление","враки","вралиха","враль","враньё","врастание","врата","вратарь","врач","врачевание","врачеватель","врачевательница","врачиха","вращение","вред","вредина","вредитель","вредительница","вредительство","вредность","вреднюга","вредоносность","врез","врезание","врезка","врезывание","временник","временность","временщик","временщица","времечко","время","времяисчисление","времянка","времяпрепровождение","времяпровождение","времясчисление","вретище","врио","врождённость","вруб","врубание","врубка","врубмашина","врубовка","врубовщик","врубок","врун","врунишка","врунья","вручение","вручитель","вручительница","вруша","врушка","всадник","всадники","всадница","всаживание","всасываемость","всасывание","всебратство","всевание","всеведение","всевидец","всевидящий","всевластие","всевластность","всевобуч","Всевышний","Вседержитель","вседневное","вседневность","вседозволенность","всеединство","всезнай","всезнайка","всезнайство","всезнание","вселение","вселенная","вселюбовь","всемилостивейшая","всемилостивейший","всемирность","всемогущество","Всемогущий","всенародность","всенощная","всеобуч","всеобщность","всеобъемлемость","всеохватность","всепогодность","всепрощенец","всепрощение","всесилие","всесильность","всесторонность","всеусердие","всеядность","вскакивание","вскапывание","вскармливание","вскатывание","вскидка","вскидывание","вскипание","всклочивание","вскормленник","вскормленница","вскрик","вскрикивание","вскрывание","вскрытие","вскрыша","вслушивание","всматривание","всовывание","вспаивание","вспархивание","вспарывание","вспахивание","вспашка","вспенивание","всплеск","всплески","всплескивание","всплывание","всполаскивание","всполох","всполье","вспольё","вспоминание","вспоможение","вспомоществование","вспрыгивание","вспрыскивание","вспугивание","вспухание","вспухлость","вспученность","вспучиваемость","вспучивание","вспушение","вспыльчивость","вспых","вспыхивание","вспышка","вставание","вставка","вставление","вставочка","встаскивание","встопорщивание","встраивание","встревоженность","встрёпка","встрёпывание","встреча","встречавшая","встречавший","встречающая","встречающий","встречная","встречник","встречный","встройка","встряска","встряхивание","вступление","всучивание","всхлип","всхлипывание","всход","всходня","всходы","всхожесть","всхолмление","всхолмлённость","всхрап","всхрапывание","всхрип","всыпание","всыпка","всякая","всякие","всякий","всякое","всячина","всячинка","вталкивание","втаптывание","втаскивание","втасовывание","втачивание","втачка","втекание","втирание","втискивание","втора","вторачивание","вторая","вторжение","вторичное","вторичность","вторник","второгодник","второгодница","второгодничество","второе","второй","второклассник","второклассница","второклашка","второкурсник","второкурсница","второочередник","второразрядник","второразрядница","второсортность","второстепенное","второстепенность","вторсырьё","втравливание","втрамбование","втрамбовывание","втуз","втузовец","втузовка","втулка","втулочка","втык","втыкание","втягивание","втяжка","втянутость","вуалетка","вуалехвост","вуалирование","вуаль","вуалька","вуз","вузовец","вузовка","вулкан","вулканизат","вулканизатор","вулканизаторщик","вулканизация","вулканизирование","вулканизм","вулканист","вулканолог","вулканология","вулканостанция","вулканчик","вульгаризатор","вульгаризаторство","вульгаризация","вульгаризм","вульгарность","вульгарщина","вундеркинд","вурдалак","вход","входящая","входящий","вхождение","вчера","вчерашнее","вчерчивание","вчинение","вчувствование","вшивание","вшивка","вшивость","въедливость","въедчивость","въезд","въездное","выбалтывание","выбегание","выбеливание","выбелка","выбивание","выбирание","выбленка","выбленки","выбой","выбойка","выбоина","выбоинка","выбойщик","выбор","выборзок","выборка","выборки","выборность","выборный","выборщик","выборщица","выборы","выбраковка","выбрасывание","выбрасыватель","выбривание","выброс","выброска","выбросы","выбрызгивание","выбуксирование","выбуравливание","выбуривание","выбучивание","выбывание","выбытие","вываживание","вывал","вываливание","вываривание","выварка","выварки","выващивание","вывевание","вывевки","выведение","выведеныш","выведывание","вывеивание","выверение","выверенность","выверка","вывёрстывание","выверт","вывёртывание","выверчивание","вывес","вывеска","выветрелость","выветренность","выветривание","вывешивание","вывинчивание","вывих","вывихнутость","вывод","выводка","выводное","выводок","выводы","вывоз","вывозка","выволакивание","выволочка","выворачивание","выворот","выворотка","выворотность","вывязка","вывязывание","вывяливание","выгадывание","выгар","выгарь","выгачивание","выгиб","выгибание","выгибка","выглаженный","выглаживание","выглядывание","выгнетание","выгнивание","выговаривание","выговор","выгода","выгодность","выгон","выгонка","выгонщик","выгораживание","выгорание","выгородка","выгравирование","выгранивание","выгребание","выгребка","выгребки","выгружатель","выгрузка","выгрузчик","выгрызание","выгул","выгуливание","выдавливание","выдаивание","выдалбливание","выдача","выдвигание","выдвиженец","выдвижение","выдвиженка","выдвиженчество","выдворение","выдел","выделанность","выделение","выделка","выделывание","выдёргивание","выдержанность","выдерживание","выдержка","выдирание","выдойка","выдох","выдра","выдрёнок","выдрючивание","выдув","выдувальщик","выдувальщица","выдувание","выдувка","выдуманность","выдумка","выдумщик","выдумщица","выдумывание","выдыхание","выезд","выездка","выем","выемка","выжаривание","выжарки","выжереб","выжеребка","выживаемость","выживание","выжиг","выжига","выжигальщик","выжигальщица","выжигание","выжидание","выжидательность","выжим","выжимание","выжимка","выжимки","выжлец","выжлица","выжловка","выжлятник","вызванивание","вызволение","вызволитель","выздоравливание","выздоравливающая","выздоравливающий","выздоровление","вызов","вызолачивание","вызревание","вызубрина","выигрыш","выискивание","выказывание","выкаливание","выкалывание","выкание","выканючивание","выкапывание","выкармливание","выкат","выкатка","выкатчик","выкатывание","выкачивание","выкачка","выкашивание","выкашливание","выквашивание","выкидка","выкидки","выкидывание","выкидыш","выкипание","выкисание","выкладка","выкладки","выкладывание","выклёвывание","выклеивание","выклейка","выклёпывание","выклик","выкликание","выкликивание","выклинивание","выключатель","выключение","выключенность","выключка","выклянчивание","выковка","выковывание","выковыривание","выкол","выколачивание","выколашивание","выколка","выколотка","выколотчик","выколупывание","выконопачивание","выкопирование","выкопировка","выкопка","выкорм","выкормка","выкормок","выкормыш","выкорчёвка","выкорчёвывание","выкос","выкрадывание","выкраивание","выкраска","выкрашивание","выкрест","выкрестка","выкривление","выкрик","выкрикивание","выкристаллизирование","выкристаллизовывание","выкроечка","выкройка","выкрут","выкрутасы","выкручивание","выкрывание","выкуп","выкупное","выкуривание","выкус","выкусывание","вылавливание","вылаз","вылазка","выламывание","вылащивание","вылёживание","вылепка","вылепливание","вылет","вылетание","вылечивание","выливание","вылизывание","вылов","вылом","выломка","вылуживание","вылупление","вылущивание","вымазывание","вымаливание","вымалывание","выманивание","вымаривание","вымарка","вымарывание","выматывание","вымах","вымачивание","вымащивание","вымбовка","вымежёвывание","выменивание","вымерзание","вымеривание","выметание","выметка","выметки","вымётывание","вымешивание","вымещение","вымирание","вымогание","вымогатель","вымогательница","вымогательство","вымоина","вымокание","вымолачивание","вымолот","вымолотка","вымолотки","вымор","вымораживание","выморозка","выморозки","выморочность","вымостка","вымочка","вымпел","вымученность","вымучивание","вымуштрованность","вымывание","вымысел","вымышленность","вымя","вынашивание","вынесение","вынизывание","вынимание","вынос","выноска","выносливость","выносная","выносной","вынуждение","выныривание","вынюхивание","выпад","выпадение","выпаивание","выпал","выпалка","выпалывание","выпар","выпаривание","выпарка","выпархивание","выпарщик","выпарщица","выпарывание","выпас","выпаска","выпахивание","выпашка","выпевание","выпекание","выпендривание","выпечатывание","выпечка","выпивала","выпивание","выпивающий","выпивка","выпивон","выпивоха","выпивший","выпиливание","выпилка","выпиловка","выпильщик","выпирание","выписанность","выписка","выписчик","выписчица","выписывание","выпись","выпихивание","выплав","выплавка","выплавление","выплакивание","выплата","выплачивание","выплёвывание","выплеск","выплёскивание","выплетание","выплод","выплывание","выплясывание","выпойка","выполаскивание","выползание","выползень","выползок","выполировывание","выполнение","выполнимость","выпор","выпоражнивание","выпорка","выпорок","выпороток","выпот","выпотевание","выпотрашивание","выправка","выправление","выпрастывание","выпрашивание","выпревание","выпрессовка","выпроваживание","выпрокидывание","выпрыгивание","выпрыск","выпрыскивание","выпрягание","выпрядание","выпрядка","выпрядывание","выпрямитель","выпрямление","выпугивание","выпуклина","выпуклость","выпуск","выпускание","выпускающий","выпускник","выпускница","выпускной","выпутывание","выпучивание","выпучина","выпушка","выпытывание","выпь","выпяливание","выпячивание","вырабатывание","выработанность","выработка","выравнивание","выравниватель","выражение","выраженность","выраженьице","выразитель","выразительница","выразительность","вырастание","выращивание","вырез","вырезание","вырезка","вырезывание","вырисовка","вырисовывание","выровненность","выродок","вырождаемость","вырожденец","вырождение","вырожденка","вырост","выросток","выруб","вырубание","вырубка","вырубщик","выруливание","выручалочка","выручение","выручка","вырывание","выряжание","высадка","высадок","высаживание","высаливание","высасывание","высачивание","высватывание","высверк","высверливание","высвет","высветление","высветливание","высвечивание","высвист","высвистывание","высвобождение","высев","высевание","высевка","высевки","высеивание","высекание","выселенец","выселение","выселенка","выселок","выси","высидка","высиживание","выскабливание","высказывание","выскакивание","выскальзывание","выскочка","выскребание","выскребки","выслеживание","выслуга","выслуживание","выслушивание","высмаливание","высматривание","высмеивание","высовывание","высоковольтка","высокогорье","высокое","высокомерие","высокомерность","высокопарность","высокость","высота","высотка","высотник","высотомер","высочество","выспевание","выспрашивание","выспренности","выспренность","выставка","выставка-продажа","выставление","выстаивание","выстёгивание","выстилание","выстилка","выстойка","выстрагивание","выстраданное","выстраданность","выстраивание","выстрачивание","выстрел","выстреливание","выстригание","выстрочка","выстругивание","выстуживание","выстукивание","выступ","выступание","выступающая","выступающий","выступка","выступление","выступления","выстывание","высучивание","высушивание","высушка","высчитывание","высылание","высылка","высыпание","высыпка","высыпки","высыхание","высь","вытаивание","выталкивание","вытапливание","вытаптывание","вытаращивание","вытаскивание","вытачивание","вытачка","вытверживание","вытекание","вытертость","вытеснение","вытеснитель","вытёсывание","вытирание","вытискивание","вытиснение","вытопка","вытопки","выторачивание","выторговывание","выточка","вытравка","вытравление","вытравливание","вытраливание","вытрамбовывание","вытребование","вытрезвиловка","вытрезвитель","вытрезвление","вытрясание","вытряска","вытряхивание","вытушёвывание","вытчик","вытыкание","выть","вытьё","вытягивание","вытяжение","вытяжка","выуживание","выученик","выученица","выучивание","выучка","выхаживание","выхаживатель","выхаркивание","выхваливание","выхватывание","выхлёбывание","выхлоп","выход","выходец","выходка","выходная","выходное","выходной","выходы","выходящий","выхолаживание","выхолащивание","выхоливание","выхухоль","выцарапывание","выцвет","выцветание","выцеживание","выцеливание","вычаливание","вычеканивание","вычерк","вычерки","вычёркивание","вычернение","вычернивание","вычерпывание","вычерчивание","выческа","вычески","вычёсывание","вычет","вычеты","вычисление","вычисления","вычислитель","вычистка","вычистки","вычитаемое","вычитание","вычитка","вычитчик","вычитывание","вычихивание","вычищение","вычура","вычурность","вычуры","вышаркивание","вышатывание","вышвыривание","вышестоящий","вышечка","вышибала","вышибание","вышивальщик","вышивальщица","вышивание","вышивка","вышина","вышка","вышкварки","вышкварок","вышколенность","вышколка","вышкомонтажник","вышкостроение","вышкостроитель","вышлифовывание","вышпаривание","выштукатуривание","вышучивание","выщелачивание","выщелк","выщёлкивание","выщербина","выщербинка","выщербление","выщипывание","выщупывание","выя","выявление","выяснение","вьетнамец","вьетнамка","вьетнамки","вьетнамцы","вьюга","вьюк","вьюковожатый","вьюн","вьюнковые","вьюновые","вьюнок","вьюночек","вьюрковые","вьюрок","вьючение","вьюшечка","вьюшка","вяз","вязальщик","вязальщица","вязание","вязанка","вязаночка","вязель","вязёнка","вязёнки","вязка","вязкость","вязник","вязовые","вязок","вязь","вякание","вяление","вялость","вятич","вятичи","вятка","вяхирь","га","габардин","габарит","габариты","габбро","габитус","гаваец","гавайка","гавайцы","гавана","гавань","гавкание","гавот","гаврик","гаврики","гага","гагакание","гагара","гагарка","гагары","гагат","гагауз","гагаузка","гагаузы","гад","гадалка","гадальщик","гадальщица","гадание","гадания","гадатель","гадательница","гадёныш","гадина","гадливость","гадости","гадость","гады","гадюка","гадюки","гадючка","гадючник","гаер","гаерство","гаечка","газ","газават","газация","газгольдер","газель","газета","газетёнка","газетка","газетчик","газетчица","газик","газирование","газировка","газировщица","газификатор","газификация","газоанализатор","газовик","газовщик","газогенератор","газок","газолин","газомер","газометр","газомотор","газон","газонепроницаемость","газонокосилка","газоносность","газончик","газообмен","газоочистка","газопровод","газопроницаемость","газоубежище","газохранилище","газы","газыри","газырь","гай","гайдамак","гайдроп","гайдук","гайка","гайковёрт","гайморит","гак","Галактика","галактики","галантерейности","галантерейность","галантерейщик","галантерейщица","галантерея","галантир","галантность","галдёж","галдение","галера","галерейка","галерея","галёрка","галерник","галёрочник","галеры","галета","галеты","галечка","галечник","галиматья","галиот","галифе","галка","галл","галлий","галлицизм","галломан","галломания","галлон","галлофоб","галлофобия","галлы","галлюцинация","гало","галоген","галогены","галоид","галоиды","галоп","галопирование","галочка","галоша","галоши","галс","галстук","галстук-бабочка","галстучек","галтель","галун","галургия","галушка","галушки","галчонок","гальванёр","гальванизация","гальванизирование","гальванизм","гальваник","гальванометр","гальванопластика","гальванопокрытие","гальваноскоп","гальваностегия","гальванотехника","галька","гальюн","гам","гамадрил","гамак","гамаша","гамаши","гамбит","гамбузия","гамкание","гамлет","гамлетизм","гамлетовщина","гамма","гамма-глобулин","гамма-излучение","гамма-квант","гамма-лучи","гамма-установка","гаммы","ганглий","гангрена","гангстер","гангстеризм","гандбол","гандболист","гандболистка","гандикап","ганец","ганза","ганка","гантель","ганцы","гаолян","гараж","гарант","гарантирование","гарантия","гарда","гардемарин","гардения","гардероб","гардеробная","гардеробщик","гардеробщица","гардина","гардинка","гарем","гаркание","гармонизатор","гармонизация","гармоника","гармонист","гармоничность","гармония","гармонь","гармошка","гарнец","гарнизон","гарнир","гарнировка","гарнитур","гарнитура","гарпия","Гарпия","гарпун","гарпунёр","гарпунщик","гарсон","гарт","гарус","гарцевание","гаршнеп","гарь","гасильник","гаситель","гастрит","гастролёр","гастролёрство","гастролёрша","гастроли","гастроль","гастроном","гастрономия","гастроскопия","гать","гаубица","гаулейтер","гауптвахта","гаусс","гафель","гашение","гашетка","гашиш","гашник","гвалт","гвардеец","гвардия","гваюла","гвинеец","гвинейка","гвинейцы","гвоздарь","гвоздик","гвоздика","гвоздики","гвоздильня","гвоздильщик","гвоздичка","гвоздичные","гвоздище","гвоздодёр","гвоздок","гвоздочек","гвоздь","геббельс","гебраизм","гебраист","гебраистика","гегелизм","гегелист","гегельянец","гегельянство","гегемон","гегемонизм","гегемония","гедонизм","гедонист","геенна","гейзер","гейзерит","гейм","гейша","гекатомба","гекзаметр","геккон","гекконы","гексахлоран","гексаэдр","гектар","гектоватт","гектограф","гектографирование","гектолитр","гелертер","гелертерство","гелий","геликон","Геликон","гелиобиология","гелиогеофизик","гелиогеофизика","гелиогравюра","гелиограф","гелиометр","гелиотерапия","гелиотехника","гелиотроп","гелиотропизм","гелиоустановка","гелиофизик","гелиофизика","гелиоцентризм","гель","гельминт","гельминтоз","гельминтолог","гельминтология","гельминты","гематит","гематоген","гематолог","гематология","гематома","гемма","гемоглобин","гемолиз","геморрой","гемофилик","гемофилия","ген","генеалогия","генезис","генерал","генерал-адмирал","генерал-адъютант","генерал-аншеф","генерал-губернатор","генерал-губернаторство","генерал-директор","генерализация","генерал-инспектор","генералиссимус","генералитет","генерал-квартирмейстер","генерал-лейтенант","генерал-майор","генерал-полковник","генерал-поручик","генерал-фельдмаршал","генеральство","генеральша","генератор","генерация","генерирование","генетик","генетика","гениальничание","гениальность","гений","генотип","генофонд","геноцид","генплан","генштаб","генштабист","геоботаник","геоботаника","геогнозия","геогност","географ","географичка","география","геодезист","геодезистка","геодезия","геокриолог","геокриология","геолог","геологиня","геология","геологоразведка","геологоразведчик","геомагнетизм","геометр","геометризм","геометричность","геометрия","геоморфолог","геоморфология","геополитика","Георгий","георгин","геосфера","геосферы","геотермика","геотермия","геофизик","геофизика","геохимик","геохимия","геоцентризм","гепард","гепарин","гепатит","геральдика","гераниевые","герань","геранька","герб","гербаризация","гербарий","гербицид","гербовая","гербоведение","гербовник","гериатрия","Геркулес","геркулес","герма","германец","германизация","германизм","германий","германист","германистика","германистка","германка","германофил","германофильство","германофоб","германофобство","германская","германцы","германы","гермафродит","гермафродитизм","Гермес","герметизация","герметик","герметичность","гермошлем","герой","героизация","героизм","героика","героин","героиня","геройство","героическое","героичность","герольд","герольдия","герольдмейстер","геронтократ","геронтократия","геронтолог","геронтология","Герострат","герпетолог","герпетология","герр","герц","герцог","герцогиня","герцогство","гестапо","гестаповец","гетера","гетерогенность","гетерозис","гетман","гетманство","гетманщина","гетра","гетры","гетто","гешефт","гешефтмахер","гешефтмахерство","гжель","гиацинт","гиббереллин","гиббереллины","гиббон","гиббоны","гибель","гибельность","гибка","гибкость","гибрид","гибридизация","гибщик","гигант","гигантизм","гигантомания","гигиена","гигиенист","гигиеничность","гигрометр","гигроскопичность","гид","гидесса","гидра","гидравлик","гидравлика","гидрант","гидрат","гидратация","гидрид","гидрирование","гидроагрегат","гидроакустик","гидроакустика","гидроаэродром","гидроаэромеханика","гидробиолог","гидробиология","гидрогенератор","гидрогенизация","гидрогеолог","гидрогеология","гидрограф","гидрография","гидродинамика","гидроизоляция","гидрокомбинезон","гидрокостюм","гидролиз","гидролог","гидрология","гидролокатор","гидролокация","гидромелиорация","гидрометаллургия","гидрометеоролог","гидрометеорология","гидрометрист","гидрометрия","гидромеханизатор","гидромеханизация","гидромеханика","гидромонитор","гидромонтажник","гидронавт","гидроплан","гидропоника","гидропресс","гидропривод","гидропульт","гидропушка","гидроресурсы","гидросамолёт","гидросистема","гидросмыв","гидросооружение","гидростанция","гидростат","гидростатика","гидрострой","гидростроитель","гидростроительство","гидросфера","гидротерапия","гидротехник","гидротехника","гидротурбина","гидроузел","гидроусилитель","гидрофизика","гидрофит","гидрофиты","гидрофобность","гидрофон","гидрохимик","гидрохимия","гидроэлектростанция","гидроэнергетика","гидроэнергия","гидроэнергоресурсы","гидры","гиена","гиены","гик","гикание","гиль","гильдия","гильза","гильотина","гильотинка","гиляк","гиляки","гилячка","Гименей","гименей","гимн","гимназист","гимназистик","гимназистка","гимназисточка","гимназия","гимнаст","гимнастёрка","гимнастёрочка","гимнастика","гимнастка","гинекей","гинеколог","гинекология","гинея","гипербола","гиперболизация","гиперболизм","гиперболичность","гиперболоид","гипербореец","гиперборейка","гиперборейцы","гиперемия","гиперзвук","гиперон","гипертермия","гипертоник","гипертония","гипертрофирование","гипертрофия","гипноз","гипнолог","гипнопедия","гипнотерапия","гипнотизация","гипнотизёр","гипнотизирование","гипнотизм","гипнотик","гиповитаминоз","гиподинамия","гипокинезия","гипоксия","гипотеза","гипотенуза","гипотермия","гипотетичность","гипотоник","гипотония","гипофиз","гипоцентр","гиппопотам","гипс","гипсование","гипсометрия","гипюр","гиревик","гирло","гирлянда","гирокомпас","гироскоп","гирька","гиря","гистолог","гистология","гит","гитан","гитана","гитаны","гитара","гитарист","гитаристка","гитлеризм","гитлеровец","гитов","гифа","гифы","гичка","глава","главарь","главбух","главврач","главенство","главк","главка","главковерх","главком","главнокомандование","главнокомандующий","главноуправляющий","главпочтамт","главреж","главстаршина","глагол","глаголица","глаголь","глагольность","глад","гладиатор","гладилка","гладильная","гладильня","гладильщик","гладильщица","гладиолус","гладкая","гладкий","гладкостволка","гладкость","гладыш","гладь","глажение","глажка","глаз","глазастость","глазенапы","глазение","глазёнки","глазет","глазирование","глазировка","глазировщик","глазировщица","глазище","глазищи","глазник","глазница","глазок","глазомер","глазоньки","глазун","глазунья","глазурование","глазуровка","глазурь","гланда","гланды","глас","гласность","гласный","глаукома","глашатай","глетчер","глечик","гликоген","глина","глинистость","глинище","глинозём","глиномешалка","глиномял","глиномялка","глинтвейн","глиптика","глиптодонт","глиптотека","глиссад","глиссада","глиссандо","глиссер","глиссирование","глист","глиста","глицерин","глициния","глобальность","глобин","глобула","глобулин","глобулы","глобус","глодание","глоксиния","глосса","глоссарий","глот","глотание","глотка","глоток","глоточек","глубина","глубинка","глубинность","глубиномер","глубины","глубоководник","глубоководность","глубоководье","глубокомысленность","глубокомыслие","глубокоснежье","глубомер","глубь","глум","глумец","глумление","глумливость","глупая","глупец","глуповатость","глупости","глупость","глупый","глупыш","глупышка","глухарёк","глухарёнок","глухари","глухарка","глухарь","глухарятина","глуховатость","глухомань","глухонемота","глухость","глухота","глухотца","глушина","глушитель","глушня","глушняк","глушь","глыба","глыбина","глыбистость","глыбища","глыбка","глюкоза","гляделка","гляделки","глядение","глянец","глянцевание","глянцевитость","глянцовка","глясе","гляциолог","гляциология","гнев","гневливость","гневность","гнедая","гнедко","гнедой","гнедуха","гнездилище","гнездо","гнездование","гнездовище","гнездовка","гнездовье","гнёздышко","гнейс","гнёт","гнида","гниение","гнилец","гниловатость","гнилокровие","гнилостность","гнилость","гнилуха","гнилушка","гниль","гнильё","гнильца","гноекровие","гноение","гной","гнойник","гнойничок","гноище","гном","гнома","гномик","гномон","гносеология","гностик","гностицизм","гну","гнус","гнусавость","гнусливость","гнусность","гнусь","гнутьё","гобелен","гобой","гобоист","говельщик","говельщица","говение","говор","говорение","говорильня","говорливость","говорок","говорун","говорунья","говоруха","говоруша","говорящая","говорящий","говядина","говядинка","говядо","гога-магога","гог-магог","гоголёк","гоголёнок","гоголь","гоголь-моголь","гогот","гоготание","гоготун","гоготунья","год","года","годик","година","годность","годовик","годовичок","годовщина","годок","годочек","годы","гол","голавлик","голавль","голая","голбец","голбчик","голгофа","Голгофа","голенастые","голенище","голеностоп","голень","голец","голиаф","голизна","голик","голица","голицы","голичка","голичок","голкипер","голландец","голландка","голландцы","голова","голован","головастик","головач","головашки","головёнка","головешка","головизна","головища","головка","головки","головная","головной","головня","головогрудь","головокружение","головоломка","головоломность","головомойка","головонька","головорез","головотяп","головотяпство","головочка","головушка","головщик","головщица","голограмма","голографирование","голография","голод","голодание","голодающая","голодающий","голодная","голодный","голодовка","голодранец","голодранка","голодуха","гололёд","гололедица","гололёдка","гололёдность","гололедь","голомянка","голопузик","голос","голосеменные","голосемянные","голосина","голосистость","голосишко","голосище","голословность","голосник","голосники","голосование","голосоведение","голосок","голосочек","голосующая","голосующий","голотурии","голотурия","голошение","голоштанник","голуба","голубевод","голубеводство","голубёнок","голубёночек","голубень","голубеобразные","голубец","голуби","голубизна","голубика","голубинка","голубиные","голубица","голубичник","голубка","голубки","голубоватость","голубое","голубок","голубонька","голубочек","голубочка","голубушка","голубцы","голубчик","голубь","голубятина","голубятник","голубятня","голый","голытьба","голыш","голышка","голь","гольд","гольдка","гольды","гольё","гольмий","гольтепа","гольф","гольфы","гольцы","гольян","голяк","голяшка","гомеопат","гомеопатия","гомеостаз","гомеостазис","гоми","гомилетика","гоминиды","гомогенность","гомология","гомон","гомосексуализм","гомосексуалист","гомункул","гомункулус","гон","гонг","гондола","гондольер","гондольера","гонение","гонец","гониометр","гониометрия","гонитель","гонительница","гонка","гонки","гонобобель","гоноболь","гонококк","гонококки","гонор","гонорар","гонорарий","гонорариум","гонорея","гонт","гонтина","гончак","гончар","гончарня","гончарство","гончая","гонщик","гонщица","гоньба","гопак","гопание","гоп-компания","гопник","гора","горб","горбатая","горбатость","горбатый","горбач","горбик","горбина","горбинка","горбинник","горбовина","горбок","горбоносость","горбочек","горбун","горбунок","горбунья","горбуша","горбушечка","горбушина","горбушка","горбыли","горбыль","горделивость","гордень","гордец","гордон","гордость","гордыня","гордячка","горе-беда","горевание","гореваньице","горе-гореваньице","горе-горюшко","горелка","горелки","горелое","горельеф","горельник","горемыка","горемычная","горемычный","горе-несчастье","горение","горенка","горе-нужда","горести","горесть","горец","горечавка","горечавковые","горечь","горжет","горжетка","горизонт","горизонталь","горизонтальность","горизонты","горилка","горилла","гористость","горихвостка","горицвет","горка","горком","горлан","горлач","горлёнок","горлик","горлинка","горлица","горло","горловина","горлодёр","горлопан","горлосечение","горлышко","горлянка","гормон","гормоны","горн","горнило","горнист","горница","горничная","горно","горновой","горновщик","горновщица","горнозаводчик","горнолыжник","горнолыжница","горнопромышленник","горнопромышленность","горнорабочий","горноспасатель","горностай","горностайка","горнушка","горняк","горнячка","горовосходитель","город","города-побратимы","город-герой","городишко","городище","городки","городничество","городничий","городничиха","городовик","городовой","городок","городошник","городошница","город-побратим","город-республика","городская","городской","город-спутник","городьба","горожанин","горожанка","горообразование","гороскоп","горох","гороховина","гороховица","горочка","горошек","горошина","горошинка","горошница","горстка","горсточка","горсть","гортань","гортензия","горушка","горчак","горчинка","горчица","горчичка","горчичник","горчичница","горшечник","горшок","горшочек","горы","горькая","горьковатость","горькость","горькуха","горькушка","горюн","горюнок","горюнья","горюха","горючее","горючесть","горюша","горюшица","горюшка","горюшко","горянка","горячее","горяченькое","горячительность","горячка","горячность","го-сотерн","госпитализация","госпиталь","госпитальные","Госплан","господа","господин","господство","господствование","Господь","госпожа","гостевание","гостёк","гостенёк","гостеприимность","гостеприимство","гостёчек","гостиная","гостинец","гостиница","гостинка","гостинодворец","гостинчик","гость","гостьюшка","гостья","гостюшка","государственник","государственность","государство","государствование","государыня","государь","госэкзамен","готика","готовальня","готовенькое","готовка","готовность","готовое","готтентот","готтентотка","готтентоты","готы","гофмаклер","гофмаршал","гофмейстер","гофр","гофре","гофрирование","гофрировка","гофрировщик","гофрировщица","гофры","гощение","граб","грабарка","грабёж","грабельки","грабельник","грабельники","грабельщик","грабельщица","грабен","грабинник","грабитель","грабительница","грабительство","грабли","граве","гравелит","гравёр","гравёрная","гравий","гравилат","гравиметр","гравиметрист","гравиметрия","гравирование","гравировка","гравировщик","гравировщица","гравитация","гравюра","град","градация","градиент","градиентометр","градина","градинка","градирня","градирование","градировка","градобитие","градобой","градоначальник","градоначальница","градоначальство","градоправитель","градостроение","градостроитель","градостроительство","градуирование","градуировка","градус","градусник","гражданин","гражданка","гражданочка","гражданский","гражданское","гражданственность","гражданство","грай","грамзапись","грамм","грамматик","грамматика","грамматист","грамм-атом","грамм-молекула","граммофон","граммофончик","граммофончики","грамота","грамотей","грамотейка","грамотёшка","грамотка","грамотная","грамотник","грамотница","грамотность","грамотный","грампластинка","гран","гранат","граната","гранатка","гранатник","гранатовые","гранатомёт","гранатомётчик","гранаты","гранд","гран-дама","гранд-дама","грандиозность","гранение","гранильник","гранильня","гранильщик","гранильщица","гранит","гранитоль","гранитчик","граница","границы","гранка","гранпасьянс","гран-при","гранула","гранулёма","гранулирование","гранулометрия","грануляция","грань","грассирование","граттаж","граф","графа","графекон","график","графика","графин","графинчик","графинюшка","графиня","графит","графление","графолог","графология","графоман","графомания","графоманка","графство","граффити","графчик","грациозность","грация","Грация","грач","грачовник","грачонок","гребёнка","гребень","гребец","гребешок","гребло","гребля","гребневик","гребнечесание","гребок","гребь","грёза","грёзы","грейдер","грейдерист","грейпфрут","грейфер","грек","греки","грелка","гремучка","гремучник","гремучники","гремушка","грена","гренадер","гренаж","гренки","гренок","грех","греховность","греховодник","греховодница","грехопадение","грецизм","греча","гречанка","гречиха","гречишник","гречишные","гречка","гречневик","гречушник","грешник","грешница","грешное","грешок","гриб","грибник","грибница","грибовар","грибоварня","грибовод","грибоводство","грибоед","грибоеды","грибок","грибосушилка","грибочек","грибы","грива","гривенник","гривенничек","гривка","гривна","гривуазность","гридень","гридин","гридница","гридня","гридь","гридьба","гризетка","гриль","гриль-бар","грильяж","грим","гримаса","гримаска","гримасник","гримасница","гримасничание","гримёр","гримёрная","гримёрша","гримировальная","гримирование","гримировка","грим-уборная","грипп","гриф","грифель","грифон","гроб","гробик","гробница","гробовщик","гробок","гробокопатель","грог","гроденапль","гродетур","гроза","грозд","гроздие","грозды","гроздь","гроздье","грозность","гром","громада","громадина","громадность","громила","громкоговоритель","громкость","громовержец","громогласность","громоздкость","громоотвод","громыхание","гросс","гроссбух","гроссмейстер","гроссмейстерство","гросфатер","грот","гротеск","грот-марсель","грот-мачта","грохот","грохотание","грохотка","грохоток","грохочение","грош","гроши","грошик","грубиян","грубиянка","грубиянство","грубоватость","грубости","грубость","груда","грудина","грудинка","грудка","грудник","грудница","грудничок","грудной","грудь","гружение","груз","груздик","груздок","груздочек","груздь","грузило","грузин","грузинец","грузинка","грузины","грузность","грузовая","грузовик","грузовичок","грузовладелец","грузовоз","грузонапряжённость","грузооборот","грузоотправитель","грузоподъёмник","грузоподъёмность","грузополучатель","грузопоток","грузотакси","грузчик","грузчица","грум","грунт","грунтование","грунтовка","групорг","группа","группетто","группирование","группировка","группка","групповод","групповодство","групповщина","группочка","грустинка","грустное","грусть","груша","грушанка","грушанковые","грушина","грушица","грушка","грушник","грушовка","грыжа","грыжесечение","грызло","грызня","грызун","грызуны","грызунья","грымза","грюндер","грюндерство","гряда","грядиль","грядка","грядочка","грядушка","грядущее","грязеводолечебница","грязелечебница","грязелечение","грязи","грязища","грязнуля","грязнуха","грязовик","грязца","грязь","грязюка","гуано","гуашь","губа","губан","губёнка","губернатор","губернаторство","губернаторша","губерния","губитель","губительница","губительность","губища","губка","губки","губно-губной","губной","губоцветные","губошлёп","губы","гувернантка","гувернёр","гугенот","гугенотка","гугеноты","гугнивость","гугня","гуд","гудение","гудок","гудочек","гудочник","гудошник","гудрон","гудронатор","гудронирование","гуж","гужеед","гужик","гужовка","гузка","гузно","гук","гукание","гул","гулёна","гуленька","гулкость","гулливость","гульба","гульбище","гульден","гулькание","гульня","гулючки","гулюшка","гуля","гуляй-город","гуляка","гуляльщик","гуляльщица","гуляние","гулянка","гуляш","гулящая","гулящий","гуляющая","гуляющий","гуманизация","гуманизм","гуманист","гуманистка","гуманитарий","гуманность","гуменник","гумённик","гуменце","гумма","гумми","гуммиарабик","гуммигут","гуммилак","гуммиластик","гуммирование","гуммоз","гумно","гумус","гунн","гунны","гунтер","гуран","гурда","гуриец","гурийка","гурийцы","гурия","гурман","гурманка","гурманство","гурт","гуртильщик","гуртовщик","гуртоправ","гурчение","гурьба","гусак","гусар","гусарик","гусарство","гусарчик","гусеводство","гусёк","гусельки","гусельник","гусельцы","гусеница","гусеничка","гусёнок","гусеобразные","гусит","гуситка","гуситы","гусли","гусляр","густель","густера","густолесье","густота","гусыня","гусь","гусятина","гусятник","гусятница","гута","гуталин","гуттаперча","гуцул","гуцулка","гуцулы","гуща","гущение","гущина","гюйс","гюрза","гяур","даба","давешнее","давилка","давило","давильня","давильщик","давка","давление","давнее","давнишнее","давнопрошедшее","давность","дагерротип","дагерротипист","дагерротипия","дагестанец","дагестанка","дагестанцы","дадан","дайджест","дакальщик","дакальщица","дакание","дактилология","дактилоскопия","дактиль","далай-лама","далеко","далёко","далёкое","далёкость","дали","даль","дальнейшее","дальнобойка","дальнобойность","дальновидение","дальновидность","дальнозоркая","дальнозоркий","дальнозоркость","дальномер","дальномерщик","дальность","дальтонизм","дальтоник","дальтонист","дальтоничка","дама","дамба","дамка","дамочка","данаец","данайка","данайцы","данник","данница","данность","данные","дансинг","дантист","дантистка","дань","дар","дарвинизм","дарвинист","дарвинистка","даргинец","даргинка","даргинцы","дарение","даритель","дарительница","дармовое","дармовщина","дармовщинка","дармоед","дармоедка","дармоедство","дарование","даровитость","даровщина","даровщинка","дароносица","дарохранительница","дарственная","дары","дарящий","дата","датель","дательница","датирование","датировка","датчане","датчанин","датчанка","датчик","даур","даурка","дауры","дафния","дача","дачевладелец","дачевладелица","дачка","дачник","дачница","даяние","два","двадцатая","двадцатилетие","двадцатипятирублёвка","двадцатка","двадцатый","двенадцатая","двенадцатилетие","двенадцатый","дверка","дверочка","дверца","дверь","двигателестроение","двигателист","двигатель","движение","движимое","движимость","движитель","движок","двоеборец","двоеборье","двоебрачие","двоеверец","двоеверие","двоеверка","двоевластие","двоедушие","двоеженец","двоежёнство","двоемужие","двоемужница","двоемыслие","двоение","двоетёс","двоеточие","двоецарствие","двоечка","двоечник","двоечница","двоешка","двоешки","двойка","двоильщик","двойник","двойники","двойня","двойнята","двойняшка","двойняшки","двойственность","двоица","двойчатка","двойчатки","двор","дворец","дворецкий","дворик","дворишка","дворишко","дворище","дворник","дворники","дворницкая","дворничиха","дворной","дворня","дворняга","дворняжка","дворовая","дворовый","дворянин","дворянка","дворяночка","дворянство","двоякодышащие","двояшка","двояшки","двугласный","двугривенник","двугривенничек","двугривенный","двудольные","двудомные","двудышащие","двуединство","двузубец","двуколка","двукрылые","двулетники","двуличие","двуличник","двуличница","двуличность","двуногие","двуокись","двуперстие","двуперстник","двупланность","двуплановость","двуполье","двуручка","двурушник","двурушница","двурушничество","двусемянка","двусмысленность","двусмыслица","двусоставность","двустволка","двустворчатые","двустишие","двусторонность","двуустка","двуутробка","двухвёрстка","двухвостка","двухвостки","двухголосие","двухколейка","двухлетие","двухлетка","двухлеток","двухолмие","двухпудовка","двухрублёвая","двухрядка","двухсотая","двухсотлетие","двухсотый","двухстволка","двухтонка","двухтысячная","двухтысячный","двухходовка","двухчасовой","двучлен","двушка","двуязычие","деавтоматизация","деаэратор","деаэрация","дебаркадер","дебаркация","дебатирование","дебаты","дебелость","дебет","дебетование","дебил","дебильность","дебит","дебитор","деблокада","деблокирование","деблокировка","дебош","дебошир","дебоширка","дебоширство","дебри","дебют","дебютант","дебютантка","Дева","дева","девальвация","деваха","деверёк","деверь","девиация","девиз","девиза","девица","девичество","девичник","девичья","девишник","девка","девон","девонька","девочка","девственник","девственница","девственность","девство","девушка","девчата","девчонка","девчоночка","девчурка","девчурочка","девчушечка","девчушка","девяностая","девяностолетие","девяностый","девясил","девятая","девятерик","девятиклассник","девятиклассница","девятилетие","девятилетка","девятисотая","девятисотлетие","девятисотый","девятитысячная","девятитысячный","девятичасовой","девятиэтажка","девятка","девятнадцатая","девятнадцатилетие","девятнадцатый","девятый","дегазатор","дегазация","дегенерат","дегенеративность","дегенератка","дегенерация","дегероизация","деготёк","деготок","дёготь","деградация","дегрессия","дёгтекурение","дегтишко","дегтярка","дегтярник","дегтярница","дегтярня","дегтярь","дегуманизация","дегустатор","дегустация","дед","деда","дедвейт","дедерон","дедина","дедка","дед-мороз","дедовник","дедовщина","дедок","дедраматизация","дедукция","дедуля","дедуня","дедушка","деды","деепричастие","дееспособность","дежа","дёжка","дежурка","дежурная","дежурный","дежурство","дезабилье","дезавуирование","дезактивация","дезертир","дезертирство","дезидераты","дезинсектор","дезинсекция","дезинтегратор","дезинтеграция","дезинфектор","дезинфекция","дезинфицирование","дезинформатор","дезинформация","дезодорант","дезодоратор","дезодорация","дезорганизатор","дезорганизация","дезорганизованность","дезориентация","дезориентирование","деидеологизация","деизм","деист","действенность","действие","действительная","действительное","действительность","действия","действо","деистка","деисус","дейтерий","дейтрон","дек","дека","декабрист","декабристка","декабристы","декабрь","декаграмм","декада","декаданс","декадент","декадентка","декадентство","декадентщина","декадник","декалитр","декалькирование","декалькомания","декаметр","декан","деканат","деканство","декатирование","декатировка","декатонна","декаэдр","деквалификация","декламатор","декламаторство","декламаторша","декламация","декламирование","декларативность","декларация","декларирование","деклассирование","деклинатор","деклинация","декодирование","декокт","деколонизация","деколь","декольте","декомпенсация","декомпрессия","декор","декоративность","декоратор","декораторская","декорация","декорирование","декорировка","декорум","декрет","декретирование","декстрин","декстрины","дела","делание","деланность","делатель","делательница","делегат","делегатка","делегация","делегирование","делёж","делёжка","деление","деления","делец","деликатес","деликатность","делимое","делимость","делитель","делишки","дело","деловик","деловитость","делопроизводитель","делопроизводительница","делопроизводство","дельное","дельта","дельта-лучи","дельтаплан","дельтапланеризм","дельтапланерист","дельфин","дельфинарий","дельфинариум","дельфинёнок","дельфиниум","дельфиниха","дельфиновые","дельфины","дельце","делювий","деляга","деляна","делянка","делячество","демагог","демагогичность","демагогия","демаркация","демарш","демаскирование","демаскировка","демикотон","демилитаризация","демисезон","демиург","демобилизация","демобилизованная","демобилизованный","демограф","демография","демократ","демократизация","демократизм","демократичность","демократия","демократка","Демон","демон","демонизм","демонология","демонополизация","демонстрант","демонстрантка","демонстратор","демонстрация","демонстрирование","демонтаж","деморализация","демос","демпинг","демпфер","демпфирование","денатурализация","денатурат","денатурация","денатурирование","денационализация","денди","дендизм","дендрарий","дендрит","дендриты","дендролог","дендрология","дендропарк","денежка","денежки","денёк","денёчек","дензнак","денник","денница","деноминация","денонсация","денонсирование","дентин","денудация","денщик","день","деньга","деньги","деньжата","деньжишки","деньжищи","деньжонки","деонтология","департамент","депеша","депо","деповец","деповский","депозит","депозитарий","депозитка","депозитор","деполитизация","депонент","депонирование","депорт","депортация","депрессия","депутат","депутатка","депутатство","депутация","дёр","дератизация","дербенник","дербенниковые","дерби","дербист","дервиш","дёргание","дергач","дергачиха","дерготня","дергун","деревенская","деревенский","деревенщик","деревенщина","деревенька","деревина","деревня","дерево","деревообделочник","деревообделочница","деревообработка","деревушка","деревце","деревцо","деревянность","деревяшечка","деревяшка","дереза","дерезняк","дёрен","дёреновые","дереняк","держава","державец","державность","державство","держак","держалка","держание","держатель","держательница","держидерево","держиморда","дерзание","дерзновение","дерзновенность","дерзостность","дерзость","дериват","деривация","дерма","дерматин","дерматит","дерматоглифика","дерматоз","дерматолог","дерматология","дерматомикоз","дерматомицет","дерматомицеты","дермографизм","дёрн","дернение","дернина","дернинка","дернище","дернование","дерновина","дерновинка","дерновище","дерновка","дерновщик","дернорез","деррик","дерть","дерьмо","дерюга","дерюжина","дерюжка","десант","десантирование","десантировка","десантник","десегрегация","десерт","десикант","десиканты","десикация","десна","десница","деспот","деспотизм","деспотичность","деспотия","деспотка","дестабилизация","дестевой","десть","десятая","десятерик","десятиборец","десятиборье","десятивёрстка","десятидневка","десятиклассник","десятиклассница","десятикопеечная","десятилетие","десятилетка","десятиминутка","десятина","десятирублёвая","десятирублёвка","десятиугольник","десятичасовой","десятка","десятки","десятник","десяток","десяточек","десятский","десятый","детализация","детализирование","деталь","деталька","детальность","детва","детвора","детдом","детдомовец","детдомовка","детдомовская","детдомовский","детектив","детектирование","детектор","детёныш","детерминант","детерминатив","детерминизм","детерминированность","детерминист","дети","детина","детинец","детинка","детинушка","детишки","детище","детка","детки","деткомбинат","деткор","детонатор","детонация","детонирование","деторождение","детоубийство","детоубийца","деточка","деточки","детплощадка","детприёмник","детрит","детсад","детсадовец","детсад-ясли","детская","детскость","детство","детушки","дефект","дефективная","дефективность","дефективный","дефектность","дефектовка","дефектовщик","дефектолог","дефектология","дефектоскоп","дефектоскопист","дефектоскопия","дефибриллятор","дефибрилляция","дефиле","дефилирование","дефинитив","дефиниция","дефис","дефицит","дефицитность","дефляция","дефолиант","дефолианты","дефолиация","деформация","деформирование","дехканин","дехканка","дехканство","децентрализация","децибел","дециграмм","децилитр","децима","дециметр","дешевизна","дешёвка","дешифратор","дешифрирование","дешифровка","дешифровщик","деэскалация","деяние","деятель","деятельница","деятельность","джаз","джаз-банд","джазист","джазистка","джайлау","джейлау","джейран","джем","джемпер","джемперок","джентльмен","джентльменство","джентри","джерсе","джерси","джига","джигит","джигитовка","джидда","джиддовник","джин","джинн","джинсы","джип","джиу-джитсу","джихад","джок","джокер","джонатан","джонка","джоуль","джугара","джунгли","джунта","джут","дзекание","дзета","дзинькание","дзот","дзюдо","дзюдоист","диабаз","диабет","диабетик","диагноз","диагност","диагностик","диагностика","диагностирование","диагональ","диаграмма","диадема","диакон","диаконица","диалект","диалектизм","диалектик","диалектика","диалектолог","диалектология","диалог","диамант","диаметр","Диана","диана","диапазон","диапозитив","диапроектор","диаскоп","диатез","диатермия","диатриба","диафильм","диафон","диафрагма","диафрагмирование","диахрония","див","диван","диван-кровать","диванная","диванчик","дивергенция","диверсант","диверсантка","диверсификация","диверсия","дивертисмент","дивиденд","дивиденды","дивизион","дивизионка","дивизия","диво","дивчина","дигиталис","дидактизм","дидактик","дидактика","дидактичность","диез","диета","диететика","диетик","диетолог","диетология","диетотерапия","диетсестра","дизайн","дизайнер","дизелестроение","дизелист","дизель","дизентерия","дикарка","дикарство","дикарь","дикая","дикий","дикобраз","дикобразиха","диковатость","диковина","диковинка","дикорос","дикоросы","дикость","диктант","диктат","диктатор","диктаторство","диктатура","диктовка","диктор","дикторша","диктофон","дикция","дилемма","дилетант","дилетантизм","дилетантка","дилетантство","дилижанс","дилогия","димедрол","диморфизм","дина","динамизм","динамик","динамика","динамит","динамитчик","динамичность","динамка","динамо","динамо-машина","динамометр","динамометрия","динар","динарий","династия","динго","динозавр","диод","диоксид","Дионис","диоптр","диоптрика","диоптрия","диорама","дипкурьер","диплококк","диплококки","диплом","дипломант","дипломантка","дипломат","дипломатика","дипломатичность","дипломатия","дипломатка","дипломник","дипломница","диптих","директива","директор","директорат","директория","директорство","директорша","директриса","дирекция","дирижаблестроение","дирижабль","дирижёр","дирижёрство","дирижирование","дисгармоничность","дисгармония","диск","дискант","дисквалификация","диск-жокей","дискобол","дискоболка","дискование","дискомфорт","дисконт","дисконтёр","дисконтирование","дискотека","дискредитация","дискредитирование","дискретность","дискриминация","дискуссионность","дискуссия","дислокация","диспансер","диспансеризация","диспепсия","дисперсия","дисперсность","диспетчер","диспетчеризация","диспетчерская","дисплей","диспозиция","диспропорциональность","диспропорция","диспут","диспутант","диспутация","диссертант","диссертантка","диссертация","диссидент","диссидентка","диссимиляция","диссонанс","диссоциация","дистанционность","дистанционный","дистанция","дистиллят","дистиллятор","дистилляция","дистих","дистрибуция","дистрофик","дистрофия","дисфункция","дисциплина","дисциплинированность","дисциплинка","дитё","дитя","дитятко","дифирамб","дифракция","дифтерит","дифтерия","дифтонг","дифтонгизация","диффамация","дифферент","дифференциал","дифференциация","дифференцирование","дифференцировка","диффузия","диффузор","дихотомия","дичина","дичок","дичь","диэлектрик","длань","длина","длиннокрылые","длиннота","длинноты","длительность","дневальный","дневальство","днёвка","дневник","дневничок","дни","днище","дно","до","добавка","добавление","добавок","добеливание","добелка","доберман","доберман-пинчер","добивание","добирание","доблести","доблесть","добор","добришко","доброволец","добровольность","добровольчество","добродей","добродетель","добродушие","доброе","доброжелатель","доброжелательница","доброжелательность","доброжелательство","доброкачественность","добронравие","добропорядочность","добросердечие","добросердечность","добросовестность","добросовестный","добрососедство","доброта","добротность","доброхот","доброхотство","добряк","добрячка","добрячок","добывание","добыток","добытчик","добытчица","добыча","добычливость","доваривание","доведение","доверенность","доверенный","доверие","доверитель","доверительница","доверительность","доверчивость","довершение","довесок","довешивание","довивание","довинчивание","довод","доводка","довольствие","довольство","довооружение","довыборы","довыполнение","довязывание","дог","догадка","догадливость","догаресса","догладывание","доглаживание","догляд","доглядчик","доглядчица","догма","догмат","догматизация","догматизм","догматик","догматика","догматичность","догмы","догнивание","договор","договорённость","договорник","догонялки","догоняшки","догорание","догревание","догрузка","додача","додекаэдр","доделка","доделывание","додумывание","доезжачий","доение","доёнка","дож","дожаривание","дождевалка","дождевание","дождевик","дождемер","дождик","дождина","дождинка","дождичек","дождишко","дождище","дождливость","дождь","дожёвывание","дожигание","дожим","дожинки","дожитие","доза","дозаправка","дозаривание","дозатор","дозволение","дозволенное","дозиметр","дозиметрист","дозиметрия","дозирование","дозировка","дозировщик","дознаватель","дознание","дозор","дозорный","дозорщик","дозревание","доигрывание","дойка","доилка","доильник","доильница","доильщик","доильщица","доимка","доимщик","дойна","дойник","дойница","дойность","дойра","доистория","док","дока","доказательность","доказательства","доказательство","доказуемость","доказывание","докаливание","докалка","докапывание","докармливание","докатывание","докачивание","докашивание","доквашивание","докембрий","докер","докидывание","докисание","доклад","докладка","докладная","докладчик","докладчица","докладывание","доклёвывание","доклеивание","доклейка","докование","доковывание","доколачивание","доконопачивание","докраивание","докраска","докрашивание","докручивание","доктор","докторант","докторантура","докторица","докторская","докторство","докторша","доктрина","доктринёр","доктринёрство","докука","документ","документализм","документалист","документалистика","документальность","документация","документец","документик","документирование","документированность","докупка","докуривание","докучливость","докучность","дол","доламывание","долбёж","долбёжка","долбление","долблёнка","долбня","долбяжка","долг","долганин","долганка","долганы","долговая","долговечность","долговое","долговременность","долгоденствие","долгожитель","долгожительница","долголетие","долгоножка","долгоножки","долгоносик","долгоносики","долгострой","долгота","долготерпение","долгунец","долгуша","долгушка","долдон","долечивание","долечка","долженствование","должишки","должишко","должник","должница","должное","должность","должок","доливание","доливка","долизывание","долина","долинка","долинушка","долихоцефал","долихоцефалия","доллар","доломан","доломит","долонь","долотечко","долото","долотце","долотцо","долька","дольмен","дольмены","дольник","дольщик","дольщица","долюшка","доля","дом","домазывание","домалывание","доматывание","домачивание","домашние","домашность","домащивание","домбра","домбрист","домбристка","домёк","домен","доменка","доменщик","домер","домеривание","доместик","доместикация","домётывание","домешивание","доминанта","доминантность","доминиканец","доминиканка","доминиканцы","доминион","доминирование","домино","доминошник","домишко","домище","домком","домкрат","домна","домностроение","домностроитель","домовик","домовина","домовитость","домовладелец","домовладелица","домовладелка","домовладение","домовладыка","домовница","домовничание","домовод","домоводка","домоводство","домовой","домогание","домогательство","домодельщина","домолачивание","домоправитель","домоправительница","домоправление","доморосток","доморощенность","домосед","домоседка","домоседство","домостроение","Домострой","домострой","домостроитель","домостроительство","домотканина","домоуправ","домоуправление","домоустройство","домохозяйка","домохозяин","домохозяйство","домочадец","домочадцы","домра","домработница","домрачей","домрист","домристка","домушник","домушница","домывание","домысел","домысливание","дон","донашивание","донг","донесение","донец","донжон","донжуан","донжуанизм","донжуанство","донизывание","донимание","донка","донкихот","донкихотизм","донкихотишка","донкихотство","донна","донник","донор","донорство","донос","доноситель","доносительница","доносительство","доносчик","доносчица","доночник","доношение","донце","донцы","дончак","донышко","донья","дооборудование","дообследование","доопыление","допайка","допаливание","допалывание","допаривание","допарывание","допахивание","допашка","допекание","допечатка","допечатывание","допивание","допиливание","допинг","дописка","дописывание","доплата","доплачивание","доплёскивание","доплетание","доплывание","доплясывание","доподлинность","дополаскивание","дополнение","дополучение","допотопность","доппаёк","доппель-кюммель","допрашивание","допревание","допризывник","допрос","допросец","допросчик","допросчица","допуск","допускаемость","допускание","допуски","допустимость","допущение","допытывание","дора","дорабатывание","доработка","доразвитие","дорастание","доращивание","дорезка","дорезывание","дорийцы","дорисовка","дорисовывание","дорка","дормез","дорога","дорогая","дороговизна","дорогое","дорогуша","дородность","дородство","дороженька","дорожка","дорожник","дорожница","дортуар","дорубание","дорубка","дорубливание","дорывание","досада","досадливость","досадование","досаждение","досаживание","досаливание","досасывание","досверливание","досвистывание","досев","досевание","досеивание","доска","доскабливание","досканец","доскональность","доследование","дословность","дослуживание","дослушивание","досмотр","досмотрщик","досмотрщица","досол","досолка","досочка","доспевание","доспехи","доспешник","доставала","доставание","доставитель","доставка","доставление","доставщик","доставщица","достаток","достаточек","достаточность","достигнутое","достижение","достижимость","достоверность","достоевщина","достоинство","достопамятность","достопримечательность","достояние","достраивание","достройка","доступ","доступность","досуг","досушивание","досушка","досыл","досылание","досылка","досыпание","досыпка","досье","досягаемость","дот","дотаивание","дотапливание","дотация","дотачивание","дотошность","дотравливание","доукомплектование","доукомплектовка","дофин","доха","дохляк","дохлятина","дохлячка","доход","доходишко","доходность","доходчивость","доходяга","доцветание","доцеживание","доцент","доцентура","дочеканивание","доченька","дочерчивание","дочерь","дочечка","дочинивание","дочитывание","дочка","дочурка","дочурочка","дочушка","дочь","дошка","дошколёнок","дошкольник","дошкольница","дощаник","дощечка","дояр","доярка","драбант","драга","драгер","драгирование","драгировка","драгоман","драгоценная","драгоценность","драгоценный","драгун","драгунка","драдедам","драение","дражайшая","дражайший","драже","дражирование","дражировка","дражировщик","дражник","дразнение","дразнилка","драка","дракон","драма","драматизация","драматизм","драматик","драматист","драматичность","драматург","драматургия","драмкружковец","драмкружок","драндулет","драница","драничка","дранка","дрань","драньё","драп","драпирование","драпировка","драпировщик","драпировщица","драпри","дратва","драхма","драцена","драч","драчка","драчливость","драчун","драчунья","дребедень","дребезг","дребезги","дребезжание","древесина","древесница","древко","древляне","древние","древности","древность","древо","древонасаждение","древонасаждения","древостой","древоточец","древоточцы","дреговичи","дредноут","дрезина","дрейф","дрек","дреколье","дреколья","дрель","дрема","дрёма","дремливость","дремота","дремотность","дремучесть","дрена","дренаж","дренирование","дресва","дресвяник","дрессирование","дрессировка","дрессировщик","дрессировщица","дриада","дриблинг","дрифтер","дробилка","дробильщик","дробина","дробинка","дробление","дроблёнка","дробница","дробность","дробовик","дробовичок","дробь","дрова","дровешки","дровишки","дровни","дровнишки","дровозаготовка","дровозаготовки","дровокол","дровосек","дровосека","дровосеки","дровосушка","дровосушня","дровца","дровяник","дрога","дрогаль","дроги","дрожание","дрождяник","дрожечки","дрожечник","дрожжевание","дрожжи","дрожина","дрожка","дрожки","дрожь","дрозд","дроздёнок","дроздиха","дроздовые","дрозофила","дрок","дромадер","дромедар","дросселирование","дроссель","дрот","дротик","дрофа","дрофёнок","дрофиные","дрочёна","друг","другая","другое","другой","дружба","дружелюбие","дружелюбность","дружественность","дружество","дружина","дружинник","дружинница","дружище","дружка","дружки","дружность","дружок","дружочек","друз","друза","друзы","друид","друидизм","друиды","друкарня","друкарь","дрызготня","дрызгун","дрызгунья","дрыхня","дрюк","дряблость","дрягиль","дрязги","дрянность","дрянцо","дрянь","дряхлость","дуайен","дуализм","дуалист","дуб","дубец","дубильня","дубильщик","дубина","дубинка","дубинноголовая","дубинноголовый","дубинушка","дубитель","дубище","дубка","дубление","дублёнка","дублёр","дублёрство","дублёрша","дублет","дубликат","дублирование","дублон","дубль","дублюр","дубляж","дубняк","дубнячок","дубоватость","дубовик","дубок","дубонос","дубоноска","дуботол","дуботолк","дубочек","дубрава","дубравка","дубравушка","дубровка","дубровник","дубровушка","дубьё","дувал","дуга","дуда","дудак","дударь","дудение","дудка","дудник","дудочка","дудочки","дудочник","дудук","дужка","дукат","дулебы","дуло","дульце","дульцинея","дульщик","дуля","дума","думание","думец","думка","думочка","думпер","думпкар","думушка","дунгане","дунганин","дунганка","дундук","дунец","дунит","дуновение","дунст","дуодецима","дупель","дуплекс","дуплекс-автотипия","дуплекс-процесс","дуплет","дуплецо","дупликация","дупло","дупловатость","дуплянка","дура","дура-голова","дурак","дуралей","дуранда","дурачество","дурачина","дурачище","дурачок","дурачьё","дурашка","дурашливость","дурдом","дурень","дурёха","дурёшка","дуриан","дурило","дуринка","дурища","дурка","дурман","дурника","дурнина","дурнишник","дурное","дурнота","дурнушка","дуролом","дурость","дурочка","дурошлёп","дурра","дурро","дуршлаг","дурында","дурь","дуст","дуся","дутар","дутарист","дутик","дутыш","дутьё","дух","духан","духанщик","духанщица","духи","духобор","духоборец","духоборка","духоборство","духоборцы","духоборчество","духоборы","духовенство","духовидение","духовидец","духовидица","духовик","духовка","духовная","духовник","духовность","духота","духотища","дуче","душ","душа","душевая","душевнобольная","душевнобольной","душевность","душегрейка","душегрея","душегуб","душегубец","душегубка","душегубство","душенька","душеприказчик","душеприказчица","душечка","душещипательность","душистость","душитель","душительница","душица","душка","душник","душок","душонка","дуэлист","дуэль","дуэлянт","дуэнья","дуэт","дуэтик","дщерь","дыба","дылда","дым","дымаппаратура","дымарь","дымзавеса","дымина","дыминка","дымище","дымка","дымник","дымность","дымогенератор","дымок","дымокур","дымоотвод","дымопровод","дымосос","дымоуловитель","дымоход","дымочек","дымчатость","дынька","дыня","дыра","дырища","дырка","дырокол","дырочка","дых","дыхальце","дыхание","дышло","дышловая","дышловой","дьявол","Дьявол","дьяволёнок","дьяволица","дьявольщина","дьяк","дьякон","дьяконица","дьяконство","дьячество","дьячиха","дьячок","дюбек","дюгонь","дюжесть","дюжина","дюжинность","дюза","дюйм","дюймовка","дюк","дюкер","дюкесса","дюна","дюноход","дюны","дюраль","дюралюминий","дюшес","дюшеска","дюшесса","дягиль","дягильник","дяденька","дядечка","дядька","дядюшка","дядя","дятел","Ева","Евангелие","евангелие","евангелик","евангелист","евангелистка","евангелисты","евангеличка","евгеника","евнух","Евразия","евреи","еврей","еврейка","еврейство","евро","евровидение","Европа","европеец","европеизация","европеизм","европейка","европейство","европейцы","европеоид","европеянин","европеянка","европий","евхаристия","егермейстер","егерская","егерство","егерь","египтолог","египтология","египтяне","египтянин","египтянка","егоза","егозливость","еда","единение","единица","единицы","единичка","единичное","единичность","единобожие","единоборец","единоборство","единобрачие","единоверец","единоверие","единоверка","единоверная","единоверный","единоверчество","единовластие","единовременность","единогласие","единодержавие","единодушие","единоземец","единоземка","единоличник","единоличница","единоличность","единомысленник","единомыслие","единомышленник","единомышленница","единонаследие","единоначалие","единоначальник","единообразие","единообразность","единоплеменник","единоплеменница","единорог","единородная","единородный","единосущность","единственное","единственность","единство","единый","едкость","едок","едун","едунья","ёж","ежевика","ежевичник","ежегодник","ежедневное","ежедневность","ежемесячник","ежеминутность","еженедельник","ёжик","ежи-рыбы","ежиха","ежонок","езда","ездка","ездовой","ездок","ёкание","екатеринка","екатериновка","ектения","ектенья","елей","елейность","елец","елина","ёлка","ёлочка","ель","ельник","ельничек","емеля","ёмкость","ендова","енот","енотка","енотовые","епанечка","епанча","епархиалка","епархия","епископ","епископство","епитимья","епитрахиль","ер","ёра","ералаш","ересиарх","ересь","еретичество","еретичка","ёрзание","ерик","ермолка","ермолочка","ерник","ёрник","ёрничество","ерофей","ерофеич","ерошка","ерунда","ерундистика","ерундовина","ёрш","ёршик","ершистость","ершишка","еры","ерь","есаул","есаульство","есаульша","естественник","естественница","естественность","естество","естествовед","естествоведение","естествознание","естествоиспытатель","естествоиспытательница","есть","ефимок","ефрейтор","ехида","ехидина","ехидна","ехидник","ехидница","ехидничание","ехидность","ехидство","ехидца","жаба","жабник","жабо","жабрей","жабродышащие","жабры","жабы","жавель","жаворонок","жавороночек","жад","жадеит","жадина","жадничание","жадность","жадюга","жажда","жаждущая","жаждущий","жакан","жакет","жакетик","жакетка","жако","жакоб","жалейка","жалейщик","жалельщик","жалельщица","жаление","жалкость","жало","жалоба","жалобность","жалобщик","жалобщица","жалование","жалонёр","жалостливость","жалостность","жалость","жальник","жальце","жалюзи","жамка","жандарм","жандармерия","жанр","жанрист","жантильничание","жантильность","жар","жара","жаргон","жаргонизм","жардиньерка","жарево","жарение","жаренка","жарёнка","жареное","жарища","жарка","жарки","жаркое","жаровенка","жаровня","жаровыносливость","жарок","жаропонижающее","жаропрочность","жаростойкость","жар-птица","жарынь","жасмин","жатва","жатка","жбан","жбанчик","жвачка","жвачные","жгут","жгутик","жгутиковые","жгуты","жгучесть","жевание","жёваное","жевок","жезл","желаемое","желание","желанная","желанный","желательность","желатин","желатинирование","желающая","желающий","желвак","желвачок","желе","железа","железина","железка","желёзка","железко","железнодорожник","железнодорожница","железняк","железо","железобетон","железы","железяка","желна","жёлоб","желобок","желонка","желтение","жёлтенькая","желтизна","желтина","желтинка","желтинник","желтобрюх","желтоватость","желтоглазка","желтозём","желток","желтокорень","желтолозник","желтопузик","желторотая","желторотик","желторотый","желтофиоль","желтоцвет","желточек","желтуха","желтушник","жёлтый","желть","желтяк","желудок","желудочек","желудочник","жёлудь","желчевик","желчегонное","желчение","желчеотделение","желчность","жёлчность","желчь","жёлчь","жеманник","жеманница","жеманничание","жеманность","жеманство","жемчуг","жемчужина","жемчужинка","жемчужница","жена","женатик","женатый","женитьба","жених","жениховство","женишок","жёнка","женолюб","женолюбец","женолюбие","женоненавистник","женоненавистничество","женоубийство","женоубийца","жён-премьер","женственное","женственность","жёнушка","женщина","женьшень","жеода","жердина","жердинка","жердинник","жердняк","жёрдочка","жердь","жердьё","жеребёнок","жеребёночек","жеребец","жеребий","жеребок","жерёбость","жеребчик","жеребьёвка","жеребьёвщик","жеребятина","жерех","жерлица","жерло","жёрнов","жернова","жерновок","жертва","жертвенник","жертвенность","жертвование","жертвователь","жертвовательница","жертвоприношение","жест","жестер","жестик","жестикулирование","жестикуляция","жестковатость","жёсткость","жестокосердие","жестокость","жесть","жестяник","жестянка","жестяночка","жестянщик","жетон","жетончик","жжение","жжёнка","жжёночка","живете","живец","живинка","живительность","живица","живность","живоглот","живоглотство","живодёр","живодёрка","живодёрня","живодёрство","живое","живой","живокость","живописец","живописность","живопись","живорез","живорождение","живосечение","живость","живот","животворность","животик","животина","животинка","животишко","животновод","животноводка","животноводство","животное","животность","животы","живучесть","живучка","живущая","живущий","живчик","живьё","жига","жигалка","жид","жидковатость","жидкое","жидкость","жидовка","жидомор","жижа","жижесборник","жижица","жизнедеятельность","жизнелюб","жизнелюбец","жизнелюбие","жизнелюбка","жизненность","жизнеобеспечение","жизнеописание","жизнеощущение","жизнепонимание","жизнерадостность","жизнеспособность","жизнестойкость","жизнестроительство","жизнетворчество","жизнеустройство","жизнеутверждение","жизнь","жиклёр","жила","жилет","жилетик","жилетка","жилеточка","жилец","жилистость","жилица","жиличка","жилище","жилка","жило","жиловатость","жилое","жилочка","жилплощадь","жилфонд","жильё","жим","жимолостные","жимолость","жинка","жир","жирандоль","жираф","жирафа","жиринка","жирник","жирнозём","жирномолочность","жирность","жиро","жирование","жировик","жировка","жирок","жиронда","Жиронда","жирондист","жирооборот","жиропот","жироприказ","жиротопление","жиры","жирянка","житель","жительница","жительство","житие","житник","житница","житняк","жито","житуха","житьё","житьецо","житьишко","жменя","жмот","жмурки","жмых","жмыходробилка","жнейка","жнец","жнея","жнива","жниво","жнивьё","жнитво","жница","жокей","жокейка","жолнер","жом","жонглёр","жонглёрство","жонглёрша","жонглирование","жонкиль","жор","жостер","жох","жраньё","жратва","жребий","жрец","жречество","жрица","жужелица","жужелицы","жужжальца","жужжальце","жужжание","жуир","жук","жук-бомбардир","жуки","жулан","жулик","жуликоватость","жульё","жульничество","жулябия","жупа","жупан","жупел","журавель","журавельник","журавлёнок","журавлеобразные","журавли","журавлик","журавлиные","журавлиха","журавль","журавушка","журение","журка","журнал","журналец","журнализм","журналист","журналистика","журналистка","журналишко","журнальчик","журфикс","журчание","журьба","жуткость","жуть","жухлость","жучка","Жучка","жучок","за","забава","забавка","забавник","забавница","забавность","забаллотирование","забалтывание","забастовка","забастовщик","забастовщица","забвение","забег","забегаловка","забегание","забеливание","забелка","заберег","заберега","забереги","забивание","забивка","забинтовывание","забирание","забитость","забияка","забиячество","забиячливость","заблуждение","забой","забойка","забойщик","забойщица","заболачивание","заболеваемость","заболевание","заболонь","заболоченность","забор","заборец","заборик","забористость","заборка","заборонование","заборчик","заборщик","забота","заботка","заботливость","заботник","заботница","заботушка","забраковывание","забрало","забранка","забрасывание","заброс","заброшенность","забулдыга","забурник","забутка","забутовка","забывание","забывчивость","забытьё","зав","заважживание","завал","заваливание","завалина","завалинка","завалка","заваль","завальня","заваривание","заварка","заваруха","заварушка","завгар","заведение","заведеньице","заведование","заведующая","заведующий","завербование","завербованная","завербованный","завербовывание","заверение","заверитель","заверительница","заверка","завёрстка","завёрстывание","завёртка","завёрточка","завёрточница","завёртчик","завёртчица","завёртывание","заверть","завершение","завершённость","завершитель","завершительница","завеса","завесь","завет","заветное","заветрие","завешивание","завещание","завещатель","завещательница","завивание","завивка","завидки","завизирование","завинчивание","завируха","завирушка","зависимость","завистливость","завистник","завистница","зависть","завиток","завиточек","завитушка","завихрение","завком","завкомовец","завладение","завлекание","завлекательность","завлечение","завод","завод-автомат","заводец","заводик","заводила","заводишко","заводище","заводнение","заводовладелец","заводоуправление","заводская","заводской","заводчанин","заводчик","заводчица","заводь","завоевание","завоевания","завоеватель","завоевательница","завоёвывание","завоз","завозка","завозня","завозчик","заволока","завораживание","заворачивание","заворот","завороха","заворошка","завсегдатай","завтра","завтрак","завтрачек","завтрашнее","завуч","завхоз","завывание","завышение","завязка","завязочка","завязывание","завязь","завяливание","загадка","загадочка","загадочное","загадочность","загадчик","загадчица","загадывание","загаживание","загазованность","загар","загарпунивание","загачивание","загашник","загвоздка","загвоздочка","загиб","загибание","заглавие","загладка","заглаживание","заглатывание","заглот","заглубление","заглушение","заглушка","заглушье","загляденье","заглядывание","загнаивание","загнанность","загнета","загнетка","загнивание","заговаривание","заговены","заговенье","заговор","заговорщик","заговорщица","загогулина","загогулинка","загогуля","заголовок","заголовочек","загон","загонка","загончик","загонщик","загораживание","загорание","загорбок","загород","загорода","загородка","загородь","загорье","заготавливание","заготовитель","заготовительница","заготовка","заготовки","заготовление","заготовщик","заготовщица","заграбастывание","заградитель","заграждение","заграница","заграничность","загранка","загребание","загребная","загребной","загривок","загривочек","загримировывание","загромождение","загромождённость","загрубелость","загрудина","загруженность","загружённость","загрузка","загрузчик","загрузчица","загрунтовывание","загрызание","загрязнение","загрязнённость","загрязнитель","загс","загубник","загул","загуменники","загуменье","загустение","загуститель","загущение","зад","задабривание","задавака","задавала","задавальщик","задавание","задавленность","задалбливание","задание","заданность","задаривание","задатки","задаток","задаточек","задача","задачка","задачник","задвигание","задвижка","задворки","задворок","задворье","задевание","задел","заделка","заделывание","заделье","задёрганность","задёргивание","задержание","задержанная","задержанный","задерживание","задержка","задержник","задернелость","задернение","задерновывание","задик","задира","задирала","задирание","задиристость","задирчивость","задирщик","задирщица","задний","задник","задница","задняя","задок","задолженность","задолжник","задор","задорец","задорина","задоринка","задористость","задорливость","задорность","задраивание","задрайка","задрапировывание","задрёмывание","задруга","задувание","задувка","задумка","задумчивость","задумывание","задурманивание","задушевность","задушение","зады","задымление","задымлённость","заеда","заедание","заедки","заезд","заездка","заезжая","заезжий","заём","заёмщик","заёмщица","заершение","зажаривание","зажжение","заживание","заживление","зажигалка","зажигание","зажигательность","зажиливание","зажим","зажимание","зажимка","зажимщик","зажимщица","зажин","зажинки","зажирение","зажитое","зажиток","зажиточность","зажмуривание","зажор","зажора","зажорина","зазеленение","заземление","зазимок","зазимье","зазнайка","зазнайство","зазноба","зазнобушка","зазор","зазубренное","зазубренность","зазубривание","зазубрина","зазубринка","зазыв","зазывала","зазывание","заигрывание","заика","зайка","заикание","заиление","заиливание","займище","заимка","заимодавец","займодержатель","займодержательница","заимствование","заинтересованность","заинтересовывание","заинтригованность","заинька","заискивание","зайцы","зайчатина","зайчик","зайчина","зайчинка","зайчиха","зайчишка","зайчище","зайчонок","закабаление","закабалённость","закавыка","закавычка","заказ","заказец","заказник","заказное","заказчик","заказчица","заказывание","закал","закалённая","закалённость","закалённый","закаливание","закалка","закалывание","закальщик","закальщица","закаменелость","заканчивание","закапчивание","закапывание","закармливание","закат","закатка","закатывание","закачивание","закачка","закашивание","закваска","заквашивание","закидывание","закипание","закисание","закислённость","закись","заклад","закладка","закладная","закладочка","закладчик","закладчица","закладывание","заклание","заклёвывание","заклеивание","заклейка","заклёпа","заклёпка","заклёпщик","заклёпщица","заклёпывание","заклинание","заклинания","заклинатель","заклинательница","заклинение","заклинивание","заклинок","заключение","заключённая","заключённый","заклятие","заковка","заковывание","заковыристость","заковырка","закол","заколачивание","заколдованность","заколдовывание","заколка","закольцовывание","закон","законвертовывание","законник","законница","законность","законовед","законоведение","законодатель","законодательница","законодательство","закономерность","законопачивание","законоположение","законопроект","законосообразность","законоучитель","законтрактовывание","законченность","законы","закопёрщик","закопёрщица","закоптелость","закоренелость","закоренение","закорки","закорюка","закорючина","закорючка","закорючки","закоснелость","закоснение","закостенелость","закостенение","закоулок","закоулочек","закраек","закрай","закраивание","закраина","закраинка","закрапывание","закраска","закрашивание","закрепа","закрепитель","закрепка","закрепление","закрепощение","закрещивание","закривление","закрой","закройка","закройная","закройщик","закройщица","закром","закрома","закругление","закруглённость","закрутасы","закрутка","закручивание","закрывание","закрытие","закуп","закупание","закупка","закупоривание","закупорка","закупорщик","закупорщица","закупщик","закупщица","закуривание","закурка","закуска","закусочка","закусочная","закусывание","закусь","закут","закута","закутка","закуток","закутывание","зал","зала","залавливание","залавок","залакировывание","заламывание","залегание","заледенение","залежалость","залежи","залёжка","залежь","залезание","залесье","залёт","залётные","залечивание","залив","заливала","заливание","заливец","заливистость","заливка","заливное","заливчатость","заливчик","заливщик","заливщица","зализ","зализа","зализанность","зализы","зализывание","залишек","зало","залог","залогодатель","залогодательница","залогодержатель","залогодержательница","заложение","заложник","заложница","залом","залп","залужение","залучение","залысина","залысинка","зальца","зальце","зальчик","заляпывание","зам","замазка","замазывание","замалёвывание","замаливание","замалчивание","заманивание","заманиха","заманка","заманчивость","замарашка","замариновывание","замаскированный","замаскировывание","замасленность","замасливание","заматерелость","заматывание","замах","замачивание","замашечка","замашка","замащивание","замедление","замедленность","замедливание","замедлитель","замежевание","замежёвывание","замеливание","замена","заменимость","заменитель","заменяемость","замер","замерзаемость","замерзание","замёрзлый","замерка","замерщик","замес","заместитель","заместительница","заместительство","замёт","замета","заметание","заметина","заметка","замётка","заметки","заметность","заметочка","замётывание","замечание","замечаньице","замечательность","замешательство","замешивание","замещаемость","замещение","заминка","заминочка","замирание","замирение","замкнутость","замок","замокание","замолачивание","замор","замораживание","заморозка","заморозки","заморозок","заморозь","заморыш","заморышек","заморье","замочек","замочка","замочник","замощение","замполит","замужество","замужство","замуравленность","замуровывание","замусливание","замусоливание","замусоривание","замухрышка","замученная","замученный","замучивание","замчишко","замчище","замша","замшелость","замывание","замызгивание","замыкание","замыкатель","замыкающий","замысел","замысловатость","замышление","замять","занавес","занавеса","занавеска","занавесочка","занавесь","занавешивание","заначка","занашивание","занесение","занижение","занимание","занимательность","заноза","занозистость","занорыш","занос","заносчивость","заношенность","зануда","занудливость","занудность","занудство","зануздывание","занумеровывание","занятие","занятия","занятность","занятость","занятьице","заоблачность","заозерье","заострение","заострённость","заочник","заочница","запад","Запад","западание","западина","западинка","западнизация","западник","западница","западничество","западня","западок","запаздывание","запаивание","запайка","запаковка","запаковщик","запаковщица","запаковывание","запакощивание","запал","запалзывание","запальник","запальчивость","запальщик","запамятование","запанибратство","запань","запаривание","запарка","запарник","запарничек","запарывание","запас","запасание","запасец","запаска","запасливость","запасная","запасник","запасной","запах","запахивание","запашка","запашник","запашок","запев","запевала","запевалка","запевание","запевка","запекание","запеканка","запеканочка","запенивание","запечатление","запечатывание","запечек","запечье","запивание","запивка","запивоха","запиливание","запинание","запинка","запиночка","запирание","запирательство","записка","записки","записочка","записывание","записыватель","запись","запихивание","заплата","заплатка","заплаточка","заплачка","заплёвывание","заплёскивание","заплесневелость","заплесневение","заплетание","заплечье","запломбировывание","заплот","заплыв","заплывание","заповедание","заповедник","заповедность","заповедование","заповедь","заподазривание","заподозривание","заподряд","запоздалость","запоздание","запой","заполаскивание","заползание","заполнение","заполненность","заполнитель","заполучение","заполье","Заполярье","запоминаемость","запоминание","запон","запона","запонка","запоночка","запонь","запор","запорашивание","запорка","запорожец","запотевание","заправила","заправитель","заправка","заправочка","заправочная","заправщик","заправщица","запрашивание","запревание","запрессовка","запрет","запретное","запретность","запрещение","заприходование","запрограммированность","запродажа","запрокидывание","запрос","запросец","запросы","запруда","запруживание","запрягание","запряжка","запрятывание","запуганность","запугивание","запудривание","запуск","запускание","запустение","запутанность","запутывание","запухание","запущение","запущенность","запчасти","запылённость","запястье","запятая","запятки","запяточки","зарабатывание","заработки","заработок","заравнивание","заражаемость","заражение","заражённость","зараза","заразительность","заразиха","заразность","зарастание","заращение","заращивание","зарево","зарегулирование","зарез","зарекомендовывание","заречанин","заречанка","заречье","заржавленность","зарисовка","зарисовочка","зарисовывание","зарифмовывание","зарница","зарод","зародыш","зарождение","зарок","заросль","зарплата","зарубание","зарубина","зарубинка","зарубка","зарубцевание","зарубщик","зарубщица","зарукавник","зарукавье","заруливание","зарумянивание","заручка","зарыбление","зарывание","заря","заряд","зарядка","зарядчик","зарядчица","заряжающий","заряжение","заряженность","заряжённость","зарянка","засада","засадка","засаживание","засаливание","засасывание","засахаривание","засветка","засвечивание","засвидетельствование","засев","засевание","засеватель","заседание","заседатель","заседательница","заседательство","заседательша","засеивание","засека","засекание","засекречивание","заселенец","заселение","заселенка","заселённость","засельщик","засечка","засидка","засиживание","засилье","засинивание","заскабливание","заскакивание","заскирдовывание","заскок","заскорузлость","заслащивание","заслеживание","заслепление","заслон","заслонение","заслонка","заслоночка","заслуга","заслуги","заслуженность","заслуживание","заслушание","заслушивание","заслюнивание","засмаливание","засмаркивание","засматривание","заснеженность","засов","засовывание","засол","засоление","засолённость","засолка","засольщик","засольщица","засоня","засорение","засорённость","засоритель","засос","заспанность","заспиртовывание","застава","заставание","заставка","застаивание","застарелость","застарение","застёгивание","застёжечка","застёжка","застёжка-молния","застекление","застенок","застенчивость","застигание","застил","застилание","застилка","застирывание","застой","застойность","застолица","застолье","застольная","застольник","застопоривание","застрагивание","застраивание","застрахование","застраховывание","застрачивание","застращивание","застревание","застрельщик","застрельщица","застреха","застригание","застройка","застройщик","застройщица","заструг","заструга","застудневание","застуживание","заступ","заступа","заступание","заступающая","заступающий","заступка","заступление","заступник","заступница","заступничество","застывание","застылость","засупонивание","засусливание","засусоливание","засуха","засухоустойчивость","засучивание","засушивание","засушка","засушливость","засчитывание","засыл","засылание","засылка","засыпание","засыпка","засыпщик","засыхание","затаённое","затаённость","затаивание","затакт","заталкивание","затапливание","затаптывание","затаривание","затасканность","затаскивание","затачивание","затвердевание","затверделость","затвердение","затверживание","затвор","затворка","затворник","затворница","затворничество","затеи","затейка","затейливость","затейник","затейница","затейничество","затейщик","затейщица","затёк","затекание","затемнение","затенение","затерянность","затёс","затёска","затёсывание","затесь","затея","затирание","затирка","затируха","затискивание","затихание","затишек","затишок","затишье","затмение","затоваренность","затоваривание","заток","затон","затончик","затопка","затопление","затопляемость","затор","затормаживание","заторможенность","заточение","заточка","заточник","заточница","затравка","затравливание","затравочка","затрагивание","затрамбовывание","затрапез","затрапезка","затрата","затраты","затрачивание","затребование","затрещина","затруднение","затруднённость","затруднительность","затуманивание","затупление","затухание","затушёвка","затушёвывание","затхлость","затыкание","затылок","затылочек","затыльник","затычка","затюковывание","затягивание","затяжка","затянутость","зауздывание","заулок","заумь","заунывность","заурядность","заусенец","заусеница","заутреня","заутюживание","заученность","заучивание","заушательство","заушение","заушник","заушники","заушница","зафрахтовывание","захаживание","захапывание","захаркивание","захваливание","захварывание","захват","захватничество","захватчик","захватчица","захватывание","захирелость","захламление","захламлённость","захламливание","захлёбывание","захлёбывающийся","захлёстывание","захлопывание","заход","захождение","захожий","захолустность","захолустье","захоронение","захребетник","захребетница","захребетничек","захребетничество","захудалость","зацапывание","зацветание","зацементирование","зацентровка","зацеп","зацепа","зацепка","зацепление","зацепочка","зачаливание","зачарованность","зачаровывание","зачатие","зачатки","зачаток","зачаточность","зачёркивание","зачернение","зачерпывание","зачерствелость","зачерствение","зачерчивание","зачёс","зачёсывание","зачёт","зачётка","зачётник","зачин","зачинатель","зачинательница","зачинивание","зачинка","зачинщик","зачинщица","зачисление","зачистка","зачитывание","зачтение","зачумлённая","зачумлённый","зашвартовывание","зашвыривание","зашеек","зашеина","зашёптывание","зашивание","зашифровка","зашифровывание","зашлаковка","зашлаковывание","зашлифовывание","зашнуровывание","зашпаклёвка","зашпаклёвывание","зашпиливание","зашпунтовывание","заштамповывание","заштемпелёвывание","заштопывание","зашторивание","заштриховка","заштриховывание","заштукатуривание","заштуковывание","защебенивание","защёлка","защёлкивание","защемление","защепка","защёчина","защип","защипка","защипок","защипочка","защипывание","защита","защитка","защитник","защитница","защищённость","защуривание","заюшка","заявитель","заявительница","заявка","заявление","заявленьице","заявщик","заявщица","заядлость","заяц","званая","звание","званый","звезда","звездинка","звездица","звёздность","звездовик","звездолёт","звездолётчик","звездоносец","звездопад","звездоплавание","звездоплаватель","звездочёт","звёздочка","звездчатка","звено","звёнышко","звень","звеньевая","звеньевой","зверёк","зверёнок","зверёныш","зверина","зверинец","зверобой","зверобойная","зверование","зверовод","звероводство","зверовщик","зверолов","звероловство","звероподобие","зверопромышленник","зверосовхоз","звероферма","зверство","зверушка","зверь","зверьё","зверюга","зверюшка","звон","звонарка","звонарня","звонарь","звонец","звонкость","звонница","звонок","звоночек","звончатость","звук","звуковоспроизведение","звукозапись","звукоизоляция","звукомаскировка","звукометрия","звуконепроницаемость","звуконоситель","звукооператор","звукопись","звукопоглощение","звукоподражание","звукоподражатель","звукоподражательность","звукопроводимость","звукопроводность","звукопроницаемость","звукоряд","звукосниматель","звукосочетание","звукоулавливатель","звукоуловитель","звукоусиление","звукоусилитель","звучание","звучность","звучок","звяк","звякание","здание","зданьице","здешний","здешняя","здоровила","здоровость","здоровье","здоровьечко","здоровьице","здоровьишко","здоровяк","здоровячка","здравие","здравица","здравница","здравомыслие","здравоохранение","здравость","здравпункт","здравствование","зебра","зебу","зев","зевака","зевание","зевок","зевота","Зевс","зеленение","зелёненькая","зелёнка","зеленная","зеленоватость","зеленомошник","зелёность","зеленушка","зеленца","зеленчук","зеленщик","зеленщица","зелёные","зелень","зеленя","зело","зелье","зельице","зельц","земец","землевед","землеведение","землевладелец","землевладелица","землевладение","земледел","земледелец","земледелие","земледелка","землекоп","землемер","землемерие","землемерка","землемерша","землеописание","землепашество","землепашец","землепользование","землепользователь","землепроходец","землероб","землеройка","землеройщик","землесос","землетрясение","землеустройство","землеустроитель","землечерпалка","землечерпание","землистость","землица","земличка","землишка","земля","Земля","земляк","земляне","земляника","землянин","землянистость","земляничина","земляничка","земляничник","землянка","земляночка","землячество","землячка","землячок","земноводные","земное","земский","земснаряд","земство","земщина","земь","зензубель","зенит","зенитка","зенитчик","зенитчица","зеница","зенкер","зенки","зенкование","зенковка","зеркало","зеркальность","зеркальце","зеркальщик","зернинка","зернистость","зернишко","зерно","зернобобовые","зерновик","зерновка","зерновки","зерновоз","зерновозка","зерновые","зернодробилка","зерноотходы","зерноочистка","зерноплющилка","зернопогрузчик","зернопровод","зерносовхоз","зерносушилка","зерноуловитель","зернохранилище","зернщик","зёрнышко","зернь","зеро","зерцала","зерцало","зет","зефир","зигзаг","зигота","зиждитель","зиждительница","зиждительство","зилант","зима","зимник","зимница","зимование","зимовище","зимовка","зимовник","зимовочка","зимовщик","зимовщица","зимовье","зимородок","зимостойкость","зимушка","зипун","зипунишечко","зипунишко","зипунок","зипунчик","зияние","злак","злаки","злаковые","злато","златоуст","златоцвет","злачок","зление","злец","зло","злоба","злобное","злобность","злободневность","злобствование","зловоние","зловонность","зловредность","злодей","злодейка","злодейство","злодеяние","злое","зложелатель","зложелательство","злокачественность","злоключение","злокозненность","злонамеренность","злонравие","злопамятность","злопамятство","злополучие","злопыхатель","злопыхательство","злорадность","злорадство","злоречие","злословие","злословия","злостность","злость","злосчастие","злотый","злоумышление","злоумышленник","злоумышленница","злоупотребитель","злоупотребление","злоязычие","злоязычник","злоязычница","злоязычность","злыдарь","злыдень","злыдни","злыдня","злюка","злючка","змееборец","змееборство","змеевик","змеелов","змеёнок","змеёныш","змеепитомник","змей","змей-горыныч","змейка","змея","змиевидность","змий","знайка","знак","знакомая","знакомец","знакомка","знакомость","знакомство","знакомый","знаменатель","знаменательность","знамение","знаменитость","знаменование","знаменоносец","знаменосец","знамя","знание","знания","знатность","знаток","знаточество","знать","знахарка","знахарство","знахарь","значение","значимость","значительность","значкист","значкистка","значок","зной","знойность","зоб","зобастость","зобик","зов","зодиак","зодчество","зодчий","зоил","зоильство","зола","золение","золистость","золка","золовка","золовушка","золотарник","золотарь","золотильщик","золотильщица","золотина","золотинка","золотистость","золотишко","золотко","золотник","золотничник","золото","золотой","золотоискатель","золотоносность","золотопогонник","золотопромышленник","золотопромышленность","золоторотец","золототысячник","золотоцвет","золотошвей","золотошвейка","золотошвейня","золотуха","золотушность","золотце","золотчик","золоудаление","золоулавливание","золоуловитель","золочение","золушка","зольник","зольность","зомби","зона","зональность","зонд","зондаж","зондирование","зонт","зонтик","зонтичные","зообаза","зоогеограф","зоогеография","зоогигиена","зоолог","зоология","зоомагазин","зооморфизм","зоопарк","зоопланктон","зоопсихолог","зоопсихология","зоосад","зоотехник","зоотехника","зоотехния","зооферма","зоренька","зоркость","зорька","зорюшка","зраза","зразы","зрачок","зрелище","зрелищность","зрелость","зрение","зримость","зритель","зрительница","зрячая","зрячесть","зрячий","зуав","зуб","зубастость","зубатка","зубатки","зубёнки","зубец","зубик","зубило","зубище","зубной","зубоврачевание","зубодёр","зубодёрка","зубок","зуболечебница","зуболечение","зуборезчик","зубоскал","зубоскалка","зубоскальство","зуботычина","зубочек","зубочистка","зубр","зубрёж","зубрёжка","зубрение","зубрёнок","зубрила","зубрилка","зубристика","зубриха","зубробизон","зубровка","зубровочка","зубцы","зубчатка","зубчатость","зубчик","зуд","зуда","зудение","зудень","зудила","зуёк","зуй","зулу","зулус","зулуска","зулусы","зуммер","зурна","зурнач","зурнист","зыбка","зыбкость","зыбление","зыбун","зыбуны","зыбучесть","зыбь","зык","зыряне","зырянин","зырянка","зычность","зюдвестка","зюзя","зюйд","зюйд-вест","зюйдвестка","зюйд-ост","зябкость","зяблик","зяблица","зябь","зятёк","зятик","зять","ибер","ибериец","иберийка","иберийцы","иберка","иберы","ибис","ибисы","ива","иван-да-марья","иванушка","иван-чай","иваси","ивина","ивишень","ивка","ивняк","ивнячок","ивовые","иволга","иврит","ивушка","игил","игиль","игла","игла-рыба","иглистость","игловые","иглодержатель","иглокожие","иглотерапевт","иглотерапия","иглоукалывание","иглофильтр","иглу","игнорирование","иго","иголка","иголочка","игольник","игольница","игольничек","игольчатость","игольщик","игольщица","игра","играющая","играющий","игрек","игривость","игристое","игристость","игрище","игрок","игротека","игрун","игрунья","игрушечка","игрушечник","игрушечница","игрушечность","игрушка","игумен","игуменство","игуменья","идальго","идеал","идеализатор","идеализация","идеализирование","идеализм","идеалист","идеалистичность","идеалистка","идеальничанье","идеальность","идейка","идейность","идентификация","идентифицирование","идентичность","идеограмма","идеография","идеолог","идеология","идея","идиллик","идилличность","идиллия","идиом","идиома","идиоматизм","идиоматика","идиоматичность","идиосинкразия","идиот","идиотизм","идиотия","идиотка","идиотство","идиш","идол","идолище","идолопоклонник","идолопоклонница","идолопоклонничество","идолопоклонство","иды","иезуит","иезуитизм","иезуитка","иезуитство","иена","иерарх","иерархичность","иерархия","иерей","иерейство","иеремиада","иероглиф","иероглифика","иероглифы","иеродьякон","иеродьяконство","иеромонах","иеромонашество","иждивенец","иждивение","иждивенка","иждивенство","иждивенчество","иже","ижица","изабелла","изба","избавитель","избавительница","избавление","избалованность","избач","изба-читальня","избачка","избегание","избежание","избёнка","избиение","избираемость","избирание","избиратель","избирательница","избирательность","избитость","избоина","изборник","избрание","избранная","избранник","избранница","избранничество","избранность","избранный","избушечка","избушка","избыток","избыточность","изваяние","изверг","извержение","извержения","известие","извёстка","известкование","известное","известность","известняк","известь","извет","изветчик","извечность","извещение","извив","извивание","извилина","извилинка","извилины","извилистость","извинение","извинительность","извлечение","извод","извоз","извозничание","извозничество","извозопромышленник","извозчик","изволение","изволок","изволочок","изворот","изворотец","изворотливость","извратитель","извращенец","извращение","извращенка","извращённость","извяливание","изгарина","изгарь","изгиб","изгибаемость","изгибание","изгибина","изглаживание","изгнание","изгнанник","изгнанница","изгнанничество","изгой","изгойство","изголовье","изголовьице","изгорода","изгородка","изгородь","изготавливание","изготовитель","изготовительница","изготовка","изготовление","изгрызание","изгрязнение","издалбливание","издание","издатель","издательница","издательство","издевательство","издёвка","издёвочка","изделие","изделье","издельник","издёрганность","издёргивание","издержка","издержки","издольщик","издольщина","издробление","издыхание","изживание","изжога","изламывание","излёт","излечение","излечивание","излечимость","изливание","излишек","излишество","излишнее","излияние","изложение","изложина","изложница","излом","изломанность","излука","излучатель","излучение","излучина","излучинка","изм","измазывание","измалывание","измальство","изматывание","измачивание","измельчание","измельчение","измельчитель","измена","изменение","изменник","изменница","изменничество","изменчивость","изменщик","изменщица","изменяемость","измерение","измеримость","измеритель","измождение","измождённость","измол","измолачивание","измор","изморозь","изморось","измотанность","измусливание","измусоливание","измученность","измы","измывательство","измыливание","измышление","измятость","изнанка","изнасилование","изначальность","изнашиваемость","изнашивание","изнеженность","изнеживание","изнеможение","изничтожение","изножье","износ","износостойкость","износоустойчивость","изношенность","изнурение","изнурённость","изнурительность","изнывание","изобара","изобата","изобилие","изобличение","изобличитель","изобличительница","изображение","изобразитель","изобразительница","изобразительность","изобретатель","изобретательница","изобретательность","изобретательство","изобретение","изоглосса","изогнутость","изогона","изограф","изография","изоклина","изоклиналь","изокружок","изолиния","изолирование","изолированность","изолировка","изолировщик","изолировщица","изолят","изолятор","изоляторный","изоляционизм","изоляционист","изоляция","изомер","изомерия","изомеры","изоморфизм","изотерма","изотермия","изотоп","изотопы","изохронность","изощрение","изощрённость","изразец","изразцы","израильтяне","израильтянин","израильтянка","израстание","израсходование","израсходованность","изреженность","изрежённость","изреживание","изрезанность","изрезывание","изрекание","изречение","изрешечивание","изрывание","изрыгание","изувер","изуверка","изуверство","изувечение","изувеченная","изувеченный","изувечивание","изукрашивание","изумление","изумлённость","изумруд","изумрудец","изумрудик","изуродование","изучение","изученность","изъедание","изъявление","изъязвление","изъян","изъяснение","изъяснения","изъяснитель","изъятие","изымание","изыск","изыскание","изысканность","изыскатель","изыскательница","изыскивание","изюбр","изюбрёнок","изюбриха","изюбрица","изюбрь","изюм","изюмина","изюминка","изящество","изящное","изящность","икание","иканье","икариец","икебана","икона","иконка","иконница","иконоборец","иконоборство","иконоборчество","иконография","иконописание","иконописец","иконопись","иконостас","иконотека","икорка","икорочка","икота","икра","икринка","икромёт","икрометание","икры","икряник","икрянка","икс","ил","иллириец","иллирийцы","иллюзион","иллюзионизм","иллюзионист","иллюзионистка","иллюзия","иллюзорность","иллюминатор","иллюминация","иллюминирование","иллюстративность","иллюстратор","иллюстраторство","иллюстрационность","иллюстрация","иллюстрирование","иловатость","илот","илька","ильм","ильма","ильменит","ильмень","ильмовник","ильмовые","имажинизм","имажинист","имажинистка","имам","имбирные","имбирь","имение","именинник","именинница","именины","именитость","именование","именьице","именьишко","имеретин","имеретинец","имеретинка","имеретинское","имеретинцы","имеретины","имечко","имидж","имиджмейкер","имитатор","имитаторство","имитаторша","имитация","имитирование","имманентность","иммельман","иммигрант","иммигрантка","иммиграция","иммобилизация","иммобильность","имморализм","иммортель","иммунизация","иммунитет","иммунность","иммунолог","иммунология","иммунотерапия","императив","императивность","император","императорство","императрица","империал","империализм","империалист","империя","имперфект","импичмент","импозантность","импорт","импортёр","импотент","импотентность","импотенция","импресарио","импрессионизм","импрессионист","импрессионистка","импровизатор","импровизаторство","импровизационность","импровизация","импровизированность","импульс","импульсивность","имущество","имущие","имя","имярек","инакомыслие","инакомыслящая","инакомыслящий","инаугурация","иная","инвазионность","инвазия","инвалид","инвалидка","инвалидность","инвалюта","инвар","инвариант","инвариантность","инвектива","инвентаризация","инвентарь","инвенция","инверсия","инвертаза","инвертирование","инвертор","инвестирование","инвеститор","инвеститура","инвестиция","инвестор","инволюция","ингалятор","ингаляторий","ингаляция","ингибитор","ингредиент","ингуш","ингуши","ингушка","индеец","индейка","индейки","индейководство","индейцы","индекс","индексация","индетерминизм","индетерминист","индианист","индианистика","индианка","индивид","индивидуал","индивидуализация","индивидуализирование","индивидуализм","индивидуалист","индивидуалистка","индивидуальность","индивидуй","индивидуум","индиго","индиец","индий","индийцы","индикатив","индикатор","индикт","индифферентизм","индифферентист","индифферентность","индоевропеец","индоевропеист","индоевропеистика","индоевропейцы","индолог","индология","индонезиец","индонезийка","индонезийцы","индоссамент","индоссант","индоссат","индуизм","индуист","индуистка","индуктивность","индуктор","индукция","индульгенция","индус","индуска","индустриализация","индустриализм","индустриальность","индустрия","индусы","индюк","индюшатина","индюшатник","индюшка","индюшонок","иней","инертность","инерция","инжектор","инженер","инженерик","инженерия","инженерство","инженерша","инженю","инжир","инициал","инициалы","инициатива","инициативность","инициатор","инициаторша","инкассатор","инкассаторша","инкассация","инкассирование","инкассо","ин-кварто","инквизитор","инквизиторство","инквизиция","инки","инкогнито","инкорпорация","инкорпорирование","инкриминация","инкриминирование","инкрустатор","инкрустация","инкрустирование","инкубатор","инкубаторий","инкубаторщик","инкубаторщица","инкубация","инкубирование","инкунабула","иннервация","инобытие","иновер","иноверец","иноверие","иноверка","иноверная","иноверный","иногородний","иногородняя","иное","иноземец","иноземка","иноземщина","иной","инок","инока","инокиня","ин-октаво","иномыслие","инопланетянин","инопланетянка","иноплеменная","иноплеменник","иноплеменница","иноплеменный","инородец","инородка","иносказание","иносказательность","иностранец","иностранка","иностранщина","иноходец","иноходка","иноходчик","иноходь","иночество","инсектарий","инсектицид","инсинуатор","инсинуация","инсоляция","инспектирование","инспектор","инспекторство","инспекторша","инспектриса","инспектура","инспекция","инспиратор","инспирация","инспирирование","инстанция","инстинкт","инстинктивность","институт","институтка","институтство","инструктаж","инструктирование","инструктор","инструкторство","инструкторша","инструкция","инструмент","инструменталист","инструменталистка","инструментальная","инструментальный","инструментальщик","инструментарий","инструментовка","инсулин","инсульт","инсультный","инсургент","инсуррекция","инсценирование","инсценировка","инсценировщик","интарсия","интеграл","интегратор","интеграция","интегрирование","интеллект","интеллектуал","интеллектуализация","интеллектуализм","интеллектуалист","интеллектуалка","интеллектуальность","интеллигент","интеллигентик","интеллигентка","интеллигентность","интеллигентщина","интеллигенция","интеллигибельность","интендант","интендантство","интенсивность","интенсификация","интервал","интервент","интервенционист","интервенция","интервидение","интервью","интервьюер","интервьюирование","интервьюируемая","интервьюируемый","интердикт","интерес","интересант","интересантка","интересничание","интересное","интересность","интересы","интерлюдия","интермедия","интермеццо","интерн","интернат","интернатура","Интернационал","интернационал","интернационализация","интернационализирование","интернационализм","интернационалист","интернационалистка","интернациональность","интернирование","интернированная","интернированный","интерпеллянт","интерпелляция","Интерпол","интерполирование","интерполяция","интерпретатор","интерпретация","интерпретирование","интерференция","интерферометр","интерферон","интерфикс","интерьер","интим","интимности","интимность","интоксикация","интонация","интонирование","интрига","интриган","интриганка","интриганство","интрижка","интродукция","интронизация","интроскопия","интроспекция","интрузив","интрузия","интубация","интуитивизм","интуитивист","интуиция","интурист","интуристка","инула","инулин","инфант","инфанта","инфантилизм","инфантильность","инфаркт","инфарктник","инфарктница","инфекционист","инфекция","инфикс","инфильтрат","инфильтрация","инфинитив","инфицирование","инфлуэнца","инфлюэнца","инфляция","ин-фолио","информант","информативность","информатика","информатор","информационность","информация","информбюро","информирование","информированность","инфразвук","инфраструктура","инфузория","инцидент","инъекция","иоакинф","иод","ион","ионизатор","ионизация","ионийцы","иония","ионосфера","ионофорез","ионтофорез","иорданец","иорданка","иорданцы","иордань","ипекакуана","иподьякон","ипокрит","ипокритка","ипокритство","ипомея","ипостась","ипотека","ипохондрик","ипохондрия","ипподром","иппология","иприт","ир","иракец","иракцы","иранец","иранист","иранистика","иранистка","иранка","иранцы","ирбис","ирга","иридий","ириска","ирисовые","ирландец","ирландка","ирландцы","ирмос","ирод","ирокез","ирокезка","ирокезы","иронизирование","иронист","ироничность","ирония","иррадиация","иррадиирование","иррационализм","иррациональность","ирреальность","иррегулярность","ирригатор","ирригация","ирритация","иск","искажение","искажённость","искалечение","искалечивание","искалывание","искание","искапывание","искариот","искариотка","искариотство","искармливание","искатель","искательница","искательность","искательство","исклёвывание","исключение","исключённая","исключённый","исключительность","исковеркивание","исковыривание","исколачивание","искомое","исконность","исконопачивание","ископаемое","искорёживание","искоренение","искорка","искра","искрашивание","искрение","искренность","искрещивание","искривление","искривлённость","искринка","искристость","искровец","искрогаситель","искромётность","искроудержатель","искроуловитель","искручивание","искупитель","искупительница","искупление","искуривание","искус","искуситель","искусительница","искусник","искусница","искусность","искусственник","искусственность","искусство","искусствовед","искусствоведение","искусствознание","искусывание","искушение","искушённость","ислам","исламизм","исландец","исландка","исландцы","испанец","испанист","испанистика","испанистка","испанка","испанцы","испарение","испарина","испаринка","испаритель","испаряемость","испепеление","испещрение","испиливание","исписывание","исповедальность","исповедальня","исповедание","исповедник","исповедница","исповедование","исповедь","испод","исподка","исподнее","исподние","исподники","исподница","исполин","исполком","исполкомовец","исполнение","исполнимость","исполнитель","исполнительница","исполнительность","исполнительный","исполнительство","использование","использованность","испольщик","испольщина","испорченность","исправимость","исправитель","исправительница","исправление","исправник","исправница","исправничество","исправничиха","исправность","испражнение","испражнения","испрашивание","испрыскивание","испуг","испуганность","испускание","испытание","испытатель","испытательница","испытуемая","испытуемый","иссаливание","иссверливание","иссекание","иссечение","исследование","исследованность","исследователь","исследовательница","иссоп","исстёгивание","исстирывание","исстрачивание","исстреливание","исступление","исступлённость","иссушение","иссыхание","иссякание","истаивание","истапливание","истаптывание","истаскивание","истачивание","истекание","истерик","истерика","истеричка","истеричность","истерия","истёсывание","истец","истечение","истина","истинное","истинность","истираемость","истирание","истискивание","истица","истлевание","истление","истовость","истод","исток","истоки","истолкование","истолкователь","истолковательница","истолковывание","истома","истомление","истончание","истончение","истопник","истопница","исторжение","историзм","историйка","историк","историограф","историография","историчность","история","источник","источниковед","источниковедение","истошность","истощение","истощённость","истребитель","истребительница","истребление","истрёпанность","истрёпывание","истукан","истуканство","истуканчик","иступление","истфак","истязание","истязатель","истязательница","истязательство","истязуемая","истязуемый","истязующая","истязующий","исхлёстывание","исход","исходатайствование","исходящая","исходящий","исхудалость","исхудание","исцарапывание","исцеление","исцелитель","исцелительница","исчадие","исчезание","исчезновение","исчёркивание","исчернение","исчерпание","исчерпанность","исчерпывание","исчерчивание","исчисление","исшаркивание","италийцы","италики","итальянец","итальянизм","итальянка","итальяноман","итальяномания","итальяноманство","итальянцы","итальянщина","ительмен","ительменка","ительмены","итератив","итог","итээровец","иуда","Иуда","иудаизм","иудаист","иудеи","иудей","иудейка","иудейство","иудушка","ихневмон","ихтиоз","ихтиозавр","ихтиол","ихтиолог","ихтиология","ичиг","ичиги","ишак","ишачок","ишемия","ишиас","ишурия","ищейка","июль","июнь","йеменец","йеменка","йеменцы","йог","йога","йогурт","йогуртерий","йод","йодоформ","йоркшир","йоркширы","йот","йота","йотация","йотирование","кабак","кабала","кабалист","кабалистика","кабальеро","кабальная","кабальный","кабан","кабанёнок","кабанина","кабаниха","кабанище","кабанок","кабанчик","кабарга","кабардинец","кабардинка","кабардинцы","кабаре","кабарожка","кабатчик","кабатчица","кабачишко","кабачище","кабачник","кабачница","кабачок","каббала","каббалист","каббалистика","кабелеукладчик","кабель","кабельтов","кабельтовый","кабельщик","каберне","кабестан","кабил","кабилы","кабина","кабинет","кабинетец","кабинетик","кабинетность","кабинка","каблограмма","каблук","каблучище","каблучник","каблучница","каблучок","каботаж","каботажка","каботажник","каботин","каботинка","каботинство","кабошон","кабриолет","кабриолетка","кабрирование","кабул","кавалер","кавалергард","кавалергардия","кавалерист","кавалерия","кавальер","кавалькада","кавардак","кавардачок","кавасаки","каватина","каверза","каверзник","каверзница","каверзность","каверна","кавитация","кавказец","кавказка","кавказцы","кавун","кавунок","кавыка","кавычка","кавычки","кагал","кагальный","каган","каганат","каганец","кагат","кагатирование","кагор","кагуан","каданс","кадастр","каденца","каденция","кадет","кадетик","кадетка","кади","кадий","кадиллак","кадило","кадильница","кадка","кадмий","кадмирование","кадочка","кадочник","кадр","кадриль","кадровая","кадровик","кадры","кадушечка","кадушка","кадык","кадычок","кадь","каёмка","каёмочка","каждая","каждение","каждодневность","каждый","казак","казакин","казаки-разбойники","казан","казанка","казанки","казанова","казанок","казара","казарка","казарма","казарменность","казах","казахи","казаченек","казаченька","казачество","казачина","казачишка","казачка","казачок","казачонок","казашка","казеин","каземат","казёнка","казённик","казённость","казёнщина","казимир","казинет","казино","казистость","казна","казначей","казначейство","казначейша","казначея","казнённая","казнённый","казнокрад","казнокрадство","казнохранилище","казнь","казуар","казуист","казуистика","казуистичность","казуистка","казус","кайен","кайзер","каик","кайла","кайло","кайловщик","кайма","каймак","кайман","кайманы","каин","каинит","кайнозой","кайра","кайф","какавелла","какаду","какао","како","какофония","кактус","кактусовые","кал","каламбур","каламбурец","каламбурист","каламбурчик","каламянка","калан","каландр","каландрирование","каландрование","каландровка","каландровщик","каланча","калач","калачик","калачная","калачник","калачница","калачня","калган","калёвка","калёвочник","калёвщик","калейдоскоп","калейдоскопичность","калека","календарик","календарь","календула","календы","каление","калечение","калечище","калибр","калибрирование","калибрование","калибровка","калибровщик","калибровщица","калибромер","калиброметр","калий","калика","калильня","калильщик","калильщица","калина","калинка","калинник","калинушка","калитка","калиточка","калиф","калифат","каличище","калла","каллиграф","каллиграфия","калмык","калмыки","калмычка","каломель","калорийность","калориметр","калориметрист","калориметрия","калорифер","калория","калоша","калоши","калуга","калужница","калуфер","калым","калымщик","калымщица","кальвиль","кальвинизм","кальвинист","кальвинистка","калька","калькирование","калькулятор","калькуляция","кальмар","кальсонина","кальсоны","кальцекс","кальций","кальцинация","кальцинирование","кальцит","кальян","калякание","камарилья","камаринская","камаринский","камас","камбала","камбаловые","камбалообразные","камбий","камбоджиец","камбоджийка","камбоджийцы","камбуз","камедетечение","камедь","камелёк","камелия","каменистость","каменка","каменобоец","каменолом","каменоломня","каменотёс","каменотёсец","каменушка","каменщик","камень","каменье","камера","камералист","камералистика","камералка","камера-обскура","камергер","камердинер","камеристка","камер-коллегия","камер-лакей","камерность","камер-паж","камертон","камерунец","камерунка","камерунцы","камер-фрау","камер-юнкер","камер-юнкерство","камешек","камешник","камея","камзол","камилавка","камин","камка","камлание","камлот","камнедробилка","камнедробление","камнеломка","камнемёт","камнеобработка","камнепад","камнерез","камнесечение","камнетёс","камнетёсец","камора","каморка","каморочка","каморщик","кампанейщина","кампания","кампучиец","кампучийка","кампучийцы","камрад","камса","камус","камуфлет","камуфлирование","камуфляж","камушек","камфара","камфора","камча","камчадал","камчадалка","камчадалы","камчатка","камыш","камышевка","камыши","камышина","камышинка","камышит","камышовка","кан","канава","канавка","канавокопатель","канадец","канадка","канадцы","канал","канализатор","канализация","канальство","каналья","канапе","канареечка","канареечник","канарейка","канат","канатник","канатопрядение","канатоходец","канатчик","канаус","канашка","канва","кандалы","кандальная","кандальник","кандальный","кандела","канделябр","кандидат","кандидатка","кандидатская","кандидатство","кандидатура","кандиль","каникулы","канистра","канитель","канительщик","канительщица","канифас","канифоль","канкан","канканёр","канканёрка","каннелюра","каннибал","каннибализм","каннибальство","канон","канонада","канонер","канонерка","канонизация","каноник","канонир","каноничность","канонник","канонница","канотье","каноэ","кант","кантабиле","канталупа","канталупка","кантата","кантеле","кантелист","кантианец","кантианство","кантик","кантилена","кантиленность","кантование","кантователь","кантовка","кантон","кантонист","кантор","канты","канун","кануфер","канцеляризм","канцелярист","канцелярия","канцелярщина","канцер","канцероген","канцлер","канцлерство","канцона","канцонетта","канчук","каньон","канюк","канючение","каолин","каолинит","кап","капание","капели","капелирование","капелла","капеллан","капель","капельдинер","капелька","капельки","капельмейстер","капельник","капельница","капер","каперс","каперство","каперсы","капилляр","капиллярность","капилляры","капитал","капиталец","капитализация","капитализм","капиталист","капиталистка","капиталовложение","капиталовложения","капиталы","капитальность","капитан","капитан-исправник","капитанство","капитанша","капитель","капитул","капитулянт","капитулянтство","капитуляция","капище","капкан","капканчик","капканщик","капли","каплица","каплун","каплюшка","капля","капо","капок","капонир","капор","капот","капотаж","капотец","капотик","капотирование","капотишко","каппа","капрал","капральный","капральство","капремонт","каприз","капризник","капризница","капризничание","капризность","капризуля","капризун","капризунья","каприс","каприфоль","каприччио","каприччо","капрон","капсель","капсула","капсюль","капсюлька","капсюля","каптаж","каптан","каптана","каптенармус","каптёрка","каптирование","капуль","капуста","капустка","капустник","капустница","капуцин","капуцинка","капюшон","кара","карабин","карабинер","карабкание","каравай","караван","караван-сарай","караванщик","каравелла","карагач","караим","караимка","караимы","караич","каракалпак","каракалпаки","каракалпачка","каракатица","каракиргиз","каракиргизка","каракиргизы","каракулевод","каракулеводство","каракули","каракуль","каракулька","каракульки","каракульча","каракуля","каракурт","карамболь","карамель","карамелька","карамора","карандаш","карандашик","карантин","карапуз","карапузик","карасик","карасишка","карасище","карась","карат","каратель","карательница","каратист","каратистка","каратэ","каратэист","каратэистка","караул","караулка","караульная","караульный","караульня","караульщик","караульщица","карачаевец","карачаевка","карачаевцы","карачун","карбамид","карбас","карбасик","карбид","карбованец","карболка","карбонад","карбонар","карбонари","карбонаризм","карбонарий","карбонат","карбонатность","карбонизация","карборунд","карбункул","карбункулёз","карбюратор","карбюрация","карга","карда","кардамон","кардан","кардинал","кардиограмма","кардиограф","кардиография","кардиолог","кардиология","кардиосклероз","кардиоскоп","каре","карел","карелка","карелы","карета","каретка","каретная","каретник","кариатида","кариб","карибка","карибы","кариес","карикатура","карикатурист","карикатурка","карикатурность","карикатурщик","кариоз","кариология","каркание","каркас","карлик","карликовость","карлица","кармазин","карман","карманник","карманница","карманчик","карманщик","карманщица","карманьола","кармашек","кармелит","кармелитка","кармин","карнавал","карниз","каронада","каротаж","каротель","каротин","карп","карпетка","карпетки","карпий","карпия","карповые","карсель","карст","карт","карта","картавая","картавление","картавость","картавый","карт-бланш","картвел","картвелка","картвелы","картёж","картёжник","картёжница","картезианец","картезианка","картезианство","картелирование","картель","картер","картеча","картечина","картечь","картина","картинг","картингист","картинка","картинность","картишки","картоведение","картограмма","картограф","картографирование","картография","картодиаграмма","картон","картонаж","картонажник","картонажница","картонка","картотека","картофелекопалка","картофелекопатель","картофелемойка","картофелесажалка","картофелина","картофелинка","картофель","картофелька","картофельник","картоха","карточка","карточки","картошечка","картошина","картошка","картуз","картузик","картузишко","картузник","картуш","картушка","карты","карусель","карусельщик","каруца","карцер","карьер","карьера","карьеризм","карьерист","карьеристка","касание","касательная","касательство","касатик","касатиковые","касатка","касатки","касаточка","касатушка","каска","каскад","каскадёр","каскетка","касса","кассатор","кассация","кассета","кассетка","кассир","кассирская","кассирша","кассия","каста","кастаньета","кастаньетка","кастаньетки","кастаньеты","кастелян","кастелянша","кастет","кастовость","кастор","касторка","кастрат","кастратка","кастрация","кастрирование","кастрюлечка","кастрюлька","кастрюльник","кастрюльница","кастрюля","кат","катавасия","катаклизм","катакомба","катакомбы","каталажка","каталектика","каталепсия","каталептик","катализ","катализатор","каталка","каталог","каталогизатор","каталогизация","каталонец","каталонка","каталонцы","каталь","катальная","катальня","катальщик","катамаран","катание","катанка","катанки","катанок","катапульт","катапульта","катапультирование","катар","катаракт","катаракта","катарсис","катастрофа","катастрофичность","катафалк","категоричность","категория","катедер-социализм","катедер-социалист","катенька","катер","катеринка","катерна","катерник","катерный","катерок","катеростроение","катет","катетер","катетеризация","катехизис","катион","каткование","катод","каток","католик","католикос","католицизм","католичество","католичка","каторга","каторжанин","каторжанка","каторжная","каторжник","каторжница","каторжный","катран","катраны","катрен","катрень","катушечка","катушечник","катушечница","катушка","катыш","катышек","катышок","катюша","каузальность","каупер","каурая","каурка","каурый","каустик","каустика","каучук","каучуконос","кафе","кафедра","кафе-концерт","кафель","кафельщик","кафе-ресторан","кафетерий","кафешантан","кафизма","кафтан","кафтанец","кафтанишко","кафтанчик","кахетинец","кахетинка","кахетинское","кахетинцы","кацавейка","кацап","кацапка","качалка","качание","качели","качение","качественность","качество","качка","качуча","каша","кашалот","кашевар","кашеварка","кашеварня","кашель","кашемир","кашица","кашка","кашкара","кашлюн","кашляние","кашмирец","кашмирка","кашмирцы","кашне","кашпо","каштан","каштанник","каштанчик","кащей","каюк","каюр","каюта","каютишка","каютка","кают-компания","кающаяся","кающийся","каяк","квадрант","квадрат","квадратик","квадратность","квадратура","квадратуры","квадрига","квадриллион","квадрильон","квазар","квакание","квакер","квакерка","квакерша","квакеры","квакуша","квакушка","квакша","квалификация","квант","кварк","кварки","кварта","квартал","квартальный","квартет","квартира","квартирант","квартирантка","квартиргер","квартирка","квартирмейстер","квартирные","квартирование","квартиронаниматель","квартиросъёмщик","квартиросъёмщица","квартирохозяйка","квартирохозяин","квартирьер","квартплата","квартуполномоченный","кварц","кварцит","квас","квасник","квасница","квасовар","квасоварение","квасоварня","квасок","квасцевание","квасцы","квашение","квашенина","квашня","квашонка","квебрахо","квёлость","квершлаг","квестор","квестура","квиетизм","квиетист","квинта","квинтет","квинтиллион","квинтильон","квинтэссенция","квипрокво","кви-про-кво","квирит","квириты","квитанция","квиток","квоктание","кворум","квота","квохтание","квочка","кеб","кегель","кегельбан","кегли","кегль","кегля","кедр","кедрач","кедрик","кедровик","кедровка","кедровник","кеды","кейф","кекс","кекуок","кекур","келарня","келарь","келейка","келейник","келейница","келейницкая","келейность","кельнер","кельнерша","кельт","кельты","келья","кембрий","кемпинг","кенар","кенарка","кенарь","кенаф","кенгурёнок","кенгуру","кендырь","кениец","кенийка","кенийцы","кенкет","кенотаф","кентавр","кепи","кепка","кепочка","кепчонка","керамзит","керамзитобетон","керамика","керамист","кератин","кератит","керенка","кержак","кержанка","кержачка","керн","кернер","керогаз","керосин","керосинка","керосинщик","керосинщица","кесарь","кессон","кессонщик","кета","кетгут","кетмень","кетч","кефаль","кефир","кечуа","кибернетизация","кибернетик","кибернетика","кибитка","кибиточка","кивание","кивер","киви","киви-киви","кивок","кидание","кизельгур","кизил","кизиль","кизильник","кизлярка","кизяк","кий","кика","кикбоксёр","кикбоксинг","кикимора","кикс","кил","кила","килечка","киллер","кило","киловатт","киловатт-час","килограмм","километр","километраж","киль","кильватер","килька","кильки","кимберлит","кимвал","кимвры","киммерийцы","кимограф","кимоно","кингстон","киндяк","кинематика","кинематограф","кинематографист","кинематографистка","кинематографичность","кинематография","кинескоп","кинетика","кинжал","кинжальчик","кинжальщик","кинза","кинизм","киник","киннамон","кино","киноактёр","киноактриса","киноаппарат","киноаппаратура","киноартист","киноартистка","киноателье","кинобоевик","кинобудка","киноварь","киновед","киноведение","кинограмма","кинодокумент","кинодокументалист","кинодокументалистика","кинодраматургия","киножурнал","кинозал","кинозвезда","киноинформация","киноискусство","кинокамера","кинокартина","кинокомедия","кинолента","кинолог","кинология","кинолюбитель","кинолюбительство","киномеханик","кинооператор","кинопанорама","кинопередвижка","киноплёнка","кинопроектор","кинопроизводство","кинопрокат","кинопромышленность","кинорежиссёр","кинорынок","киносеанс","киносеть","киностудия","киносценарий","киносъёмка","кинотеатр","кинотека","кинотехника","киноустановка","кинофестиваль","кинофикация","кинофильм","кинохроника","киношка","киношник","киношница","киноэкран","киоск","киоскёр","киоскёрша","киот","кипа","кипарис","кипарисовые","кипение","кипень","кипер","кипрегель","кипрей","кипрейные","киприот","киприотка","киприоты","кипсек","кипучесть","кипятилка","кипятильник","кипятильня","кипяток","кипяточек","кипячение","кираса","кирасир","киргиз","киргизка","киргизы","кирза","кирзач","кирзачи","кириллица","кирка","кирпич","кирпичик","кирпичина","кирпичинка","кирпичник","кирха","киршвассер","киса","кисейка","киселёк","киселик","кисель","кисельник","кисельница","кисет","кисетик","кисея","киска","кислина","кислинка","кислица","кисличные","кисловатость","кисловка","кислород","кислота","кислотность","кислотостойкость","кислотоупорность","кисляй","кислятина","кисонька","киста","кистень","кистовяз","кисточка","кисть","кит","китаевед","китаеведение","китаец","китайка","китаист","китаистика","китайцы","китайчонок","китаянка","кителёк","китель","китёнок","китобоец","китобой","китовина","китолов","китоловство","китообразные","кит-полосатик","кифара","кифоз","кичка","кичливость","кишение","кишечник","кишечнополостные","кишка","кишки","кишлак","кишлачник","кишмиш","киянка","клавесин","клавиатура","клавикорд","клавикорды","клавир","клавираусцуг","клавиш","клавиша","клад","кладбище","кладезь","кладка","кладовая","кладовка","кладовочка","кладовушка","кладовщик","кладовщица","кладоискатель","кладочка","кладчик","кладь","клака","клакёр","клаксон","клан","клапан","клапштос","кларет","кларнет","кларнетист","кларнетистка","класс","классик","классика","классики","классификатор","классификация","классифицирование","классицизм","классицист","классичность","классная","классность","классовость","классы","клаузула","клацание","клёв","клевание","клевер","клеверище","клевета","клеветник","клеветница","клевок","клеврет","клеевар","клееварение","клееварка","клееварня","клеение","клеёнка","клеёночка","клеёнщик","клеёнщица","клей","клейка","клейковатость","клейковина","клейкость","клеильня","клеймение","клеймёный","клеймо","клеймовщик","клейстер","клёкот","клёкт","клектание","клемма","клён","кленок","кленочек","клепало","клепальщик","клепальщица","клепание","клёпань","клёпка","клёпочник","клеппер","клепсидра","клептократ","клептократия","клептократка","клептоман","клептомания","клептоманка","клерикал","клерикализм","клерк","клёст","клетка","клеточка","клеточник","клеточница","клетух","клетушка","клетчатка","клеть","клёцка","клёцки","клёш","клешня","клещ","клещевина","клещевинник","клещеножка","клещи","клещик","кливер","клиент","клиентела","клиентка","клиентская","клиентура","клизма","клизмочка","клик","клика","клико","кликун","кликуша","кликушество","климакс","климактерий","климат","климатография","климатолог","климатология","климатотерапия","клин","клиника","клиницист","клинкер","клинкерование","клинкет","клинок","клинометр","клинопись","клинтух","клинышек","клип","клипер","клиперок","клипс","клипса","клипсы","клир","клирик","клиринг","клирос","клирошанин","клирошанка","клистир","клич","кличка","клише","клиширование","клоака","клоачные","клобук","клобучок","клозет","клок","клокот","клокотание","клоктун","клон","клонирование","клоп","клопик","клоповник","клопомор","клопфер","клоп-черепашка","клот","клотик","клоун","клоунада","клоунесса","клохтание","клохтунья","клочка","клочковатость","клочок","клуб","клубенёк","клубень","клубмен","клубнеплод","клубника","клубниковка","клубничка","клубничник","клубок","клубочек","клумба","клумбочка","клуня","клупп","клуша","клушка","клык","клыки","клычок","клюв","клювик","клювонос","клюворыл","клюз","клюка","клюква","клюквенник","клюквина","клюквинка","клюковка","ключ","ключарь","ключик","ключица","ключник","ключница","клюшка","клякса","клякспапир","клянча","кляп","кляссер","клятва","клятвопреступление","клятвопреступник","клятвопреступница","кляуза","кляузник","кляузница","кляузничество","кляча","клячонка","кнастер","кнели","кнель","кнехт","кнехты","книга","книговед","книговедение","книгодержатель","книгоед","книгоиздатель","книгоиздательство","книголюб","книгоноша","книгообмен","книгопечатание","книгопечатник","книгопечатня","книгопродавец","книготорговец","книготорговля","книгохранилище","книгочей","книжечка","книжица","книжища","книжка","книжник","книжница","книжность","книжонка","кникс","книксен","кница","книш","кнопка","кнопочка","кнут","кнутик","кнутишко","кнутище","кнутовище","кныш","княгинюшка","княгиня","княжата","княжение","княженика","княжество","княжик","княжич","княжна","князёк","князёнок","князенька","князишка","князь","князюшка","коагулирование","коагулянт","коагулят","коагуляция","коала","коалиция","кобальт","кобелёк","кобель","кобеняк","кобза","кобзарство","кобзарь","кобольд","кобра","кобура","кобчик","кобыз","кобыла","кобылёнка","кобылица","кобылка","кобылочка","кобылятина","кобылятник","ков","ковало","коваль","коварность","коварство","кователь","ковач","ковбой","ковбойка","ковёр","коверкание","коверкот","ковёрный","ковёр-самолёт","ковёрчик","ковёрщик","ковёрщица","ковка","ковкость","коврига","коврижечка","коврижка","коврик","ковровщик","ковровщица","ковродел","ковроделие","ковроделка","ковроткачество","ковчег","ковш","ковшик","ковшичек","ковы","ковыль","ковыльник","ковыляние","ковырялка","ковыряние","когорта","коготок","коготь","когти","когтище","когтищи","код","кода","кодеин","кодекс","кодирование","кодировка","кодировщик","кодировщица","кодификатор","кодификация","коечка","кожа","кожан","кожанка","кожевенник","кожевник","кожевница","кожевничество","кожевня","кожедёр","кожеед","кожемяка","кожечка","кожзаменитель","кожимит","кожистокрылые","кожица","кожник","кожура","кожурка","кожух","кожушок","кожьё","коза","козёл","козелец","козелки","козелок","Козерог","козерог","козетка","козлёнок","козлёночек","козлетон","козлец","козлик","козлина","козлище","козлобородник","козлогласование","козлодрание","козлы","козляк","козлятина","козлятки","козлятник","козлятушки","козни","кознь","козовод","козоводство","козодой","козон","козонок","козоны","козочка","козуля","козулятина","козырёк","козырки","козырь","козыряние","козюлька","козюля","козявка","козявочка","койка","койко-день","койне","койот","кок","кока","кокаин","кокаинизм","кокаинист","кокаинистка","кока-кола","кокарда","кокардочка","кокет","кокетка","кокетливость","кокетничание","кокетство","кокиль","кокк","кокки","коклюш","коклюшка","кокон","коконник","коконщик","коконщица","кокор","кокора","кокос","кокотка","кокошник","кокошница","кокошничек","кокс","кок-сагыз","коксование","коксохимия","коктейль","коктейль-холл","кокурка","кол","кола","колба","колбаса","колбаска","колбасная","колбасник","колбасница","колбочка","колбочки","колгота","колготки","колготня","колдобина","колдобинка","колдобоина","колдовка","колдовство","колдун","колдуны","колдунья","колебание","колеблемость","колеблющаяся","колеблющийся","коленка","коленкор","колено","коленопреклонение","коленочка","коленце","колер","колеровщик","колеровщица","колёсико","колесни","колесник","колёсник","колесница","колесо","колесование","колёсопрокатчик","колет","колечко","колея","колибри","колик","колика","колики","колит","количество","колка","колкость","коллаборационизм","коллаборационист","коллаж","коллапс","коллега","коллегиальность","коллегиум","коллегия","колледж","коллеж","коллектив","коллективизация","коллективизм","коллективист","коллективистка","коллективность","коллектор","коллекционер","коллекционерство","коллекционирование","коллекция","колли","коллизия","коллодий","коллодиум","коллоид","коллоквиум","коло","колоб","колобашка","колобок","колобродица","колобродник","колобродница","колобродство","коловерть","коловорот","коловратка","коловратки","коловратность","коловращение","колода","колодезник","колодезь","колодец","колодина","колодка","колодки","колодник","колодница","колодочка","колодчик","колодье","колок","колокол","колокола","колоколенка","колоколец","колокольник","колокольница","колокольня","колокольчик","колокольчики","колокольчиковые","колокольщик","коломазь","Коломбина","коломенка","колон","колонат","колониализм","колониалист","колонизатор","колонизаторство","колонизация","колонист","колонистка","колония","колонка","колонна","колоннада","колонновожатый","колонок","колонтитул","колонцифра","колоратура","колориметр","колориметрия","колорист","колорит","колоритность","колос","колосик","колосник","колосники","колосовик","колосовые","колосок","колосочек","колосс","колоссальность","колотилка","колотовка","колоток","колотун","колотуха","колотушка","колотушки","колоть","колотье","колотьё","колочение","колоша","колошение","колошник","колпак","колпачок","колпик","колпица","колтун","колумб","колумбарий","колумбиец","колумбийка","колумбийцы","колун","колхоз","колхозник","колхозница","колча","колчаковец","колчаковцы","колчаковщина","колчан","колчедан","колыбель","колыбелька","колыбельная","колымага","колымажка","колыхание","колышек","колышень","кольдкрем","колье","кольматаж","кольраби","кольт","кольца","кольцевание","кольцо","кольчатость","кольчец","кольчецы","кольчико","кольчуга","кольчужник","кольщик","колючесть","колючка","колюшка","коляда","колядка","колядование","коляска","колясочка","ком","кома","команда","командарм","командир","командирование","командированная","командированный","командировка","командировочка","командировочная","командировочные","командировочный","командирство","командирша","командование","командор","командующий","комар","комара","комарик","комаришка","комарище","комарник","комары","комарьё","комбайн","комбайнер","комбайнёр","комбайнерка","комбайнёрка","комбайнёрша","комбайнирование","комбайностроение","комбат","комбед","комбедовец","комбижир","комбикорм","комбинат","комбинатор","комбинаторика","комбинация","комбине","комбинезон","комбинирование","комбриг","комвзвод","комвзвода","комдив","комедиант","комедиантка","комедиантство","комедийность","комедиограф","комедия","комедь","комелёк","комель","комендант","комендантская","комендантство","комендантша","комендатура","комендор","комераж","комеражи","комета","кометоискатель","коми","комизм","коми-зыряне","комик","комикование","комикс","комильфо","комильфотность","комингс","Коминтерн","коми-пермяки","комиссар","комиссариат","комиссарство","комиссарша","комиссионер","комиссионерство","комиссионка","комиссионные","комиссионный","комиссия","комиссование","комитат","комитент","комитет","комитетчик","комическое","комичность","комковатость","комкор","комментарий","комментатор","комментирование","коммерсант","коммерциализация","коммерция","комми","коммивояжёр","коммивояжёрство","коммуна","коммуналка","коммунальник","коммунар","коммунарка","коммунизм","коммуникабельность","коммуникативность","коммуникация","коммунист","коммунистка","коммутатор","коммутаторная","коммутация","коммюнике","комната","комнатёнка","комнатишка","комнатка","комнатушечка","комнатушка","комод","комодец","комодик","комок","комолость","комочек","компактность","компания","компаньон","компаньонка","компаратив","компаративизм","компаративист","компаративистика","компартия","компас","компасы","компаунд","компендий","компендиум","компенсатор","компенсация","компетентность","компетенция","компилирование","компилятивность","компилятор","компиляция","комплекс","комплексирование","комплексность","комплект","комплектация","комплектирование","комплектность","комплектование","комплектовка","комплектовщик","комплектовщица","комплекция","комплемент","комплементарность","комплимент","комплиментарность","комплиментщик","комплиментщица","комплот","композитор","композиторство","композиторша","композиционность","композиция","комполка","компонент","компонист","компоновка","компоновщик","компост","компостер","компостирование","компот","компотик","компрадор","компресс","компрессик","компрессия","компрессор","компрессорная","компрессорщик","компрометация","компрометирование","компромисс","компьютер","компьютеризация","комроты","комсомол","комсомолец","комсомолия","комсомолка","комсорг","комсостав","комфлот","комфорт","комфортабельность","комышек","комэск","кон","конармеец","конармейка","конармия","конвейер","конвейеризация","конвейерщик","конвейерщица","конвектор","конвекция","конвент","конвенция","конвергентность","конвергенты","конвергенция","конверсия","конверт","конвертер","конвертик","конвертирование","конвертируемость","конверторник","конверторщик","конвой","конвойный","конвоир","конвоирование","конвульсивность","конвульсии","конвульсия","конгениальность","конгломерат","конголезец","конголезка","конголезцы","конгрегация","конгресс","конгрессист","конгрессмен","конгруэнтность","кондак","конденсат","конденсатор","конденсация","конденсирование","кондёр","кондитер","кондитерская","кондитерша","кондиционер","кондиционирование","кондиция","кондоминиум","кондор","кондотьер","кондратий","кондрашка","кондуит","кондуктор","кондукторша","коневод","коневодство","конёк","конёк-горбунок","конесовхоз","конеферма","конец","конечности","конечность","коник","конина","конишка","конище","конка","конкиста","конкистадор","конкистадоры","конклав","конкордат","конкретизация","конкретность","конкреции","конкреция","конкубинат","конкур","конкурент","конкурентка","конкурентоспособность","конкуренция","конкурирование","конкурс","конкурсант","конкурсантка","конная","конник","конница","конногвардеец","конножелезка","коннозаводство","коннозаводчик","конный","коновал","коновальство","коновод","коноводка","коновязь","коногон","конокрад","конокрадство","конопатина","конопатинка","конопатка","конопатчик","конопатчица","конопать","конопачение","конопель","конопелька","конопинка","коноплевод","коноплеводство","коноплёвые","конопля","конопляник","коноплянка","конопушка","коносамент","консенсус","консервант","консервативность","консерватизм","консерватор","консерваторец","консерватория","консерваторка","консервация","консервирование","консервщик","консервщица","консервы","консигнант","консигнатор","консигнация","консилиум","консистенция","консистория","консисторский","конскрипция","консолидация","консолидирование","консоль","консоляция","консоме","консонанс","консонант","консонантизм","консорциум","конспект","конспективность","конспектирование","конспиративность","конспиратор","конспирация","константа","константность","констатация","констатирование","констебль","конституирование","конституционализм","конституционалист","конституционист","конституционность","конституция","конструирование","конструктивизм","конструктивист","конструктивистка","конструктивность","конструктор","конструкторша","конструкция","консул","консульство","консультант","консультация","консультирование","консульша","консьерж","консьержка","контакт","контактность","контаминация","контейнер","контейнеровоз","контекст","контингент","континент","континентальность","контокоррент","контора","конторка","конторская","конторщик","конторщица","контра","контрабанда","контрабандист","контрабандистка","контрабас","контрабасист","контрагент","контрагентство","контраданс","контр-адмирал","контракт","контрактант","контрактация","контрактура","контральто","контрамарка","контрамарочник","контрамарочница","контрапост","контрапункт","контрапунктист","контраргумент","контраст","контрастность","контратака","контрафагот","контрафаготист","контрафакция","контргайка","контргруз","контрданс","контрибуция","контригра","контрманёвр","контрмера","контрмина","контрминоносец","контрнаступление","контроверза","контроверсия","контролёр","контролёрша","контролирование","контроллер","контроль","контрольная","контрпар","контрпредложение","контрразведка","контрразведчик","контрреволюционер","контрреволюционерка","контрреволюционность","контрреволюция","контрудар","контрфорс","контры","контрэскарп","контуженная","контуженный","контузия","контур","конунг","конура","конурка","конус","конфедерат","конфедератка","конфедерация","конфекцион","конферанс","конферансье","конференц-зал","конференция","конфессия","конфета","конфетина","конфетка","конфетница","конфетти","конфетчик","конфетчица","конфигурация","конфидент","конфидентка","конфиденциальность","конфиденция","конфирмация","конфискация","конфискование","конфитюр","конфликт","конфликтность","конфорка","конформизм","конформист","конфронтация","конфуз","конфузия","конфузливость","конфуцианец","конфуцианство","концентрат","концентрация","концентризм","концентрирование","концентрированность","концентричность","концентры","концептуализм","концептуалист","концептуальность","концепция","концерн","концерт","концертант","концертантка","концертино","концертирование","концертмейстер","концессионер","концессия","концлагерь","концовка","кончик","кончина","конъектура","конъюгация","конъюнктив","конъюнктива","конъюнктивит","конъюнктура","конъюнктурщик","конъюнктурщина","конъюнктурщица","конь","коньки","конькобежец","конькобежка","коньяк","коньячок","конюх","конюшенный","конюший","конюшня","конюшонок","коняга","коняка","кооператив","кооператор","кооперация","кооперирование","кооптация","кооптирование","координата","координатор","координаты","координация","координирование","координированность","копа","копал","копалка","копальщик","копальщица","копание","копанка","копань","копатель","копательница","копач","копеечка","копеечная","копеечник","копеечница","копейка","копейщик","копёнка","копёр","копёрщик","копёшка","копи","копиизм","копийка","копиист","копилка","копир","копирка","копировальщик","копировальщица","копирование","копировка","копировщик","копировщица","копист","копица","копия","копка","копление","копна","копнение","копнильщик","копнильщица","копнитель","копорка","копотливость","копотня","копотун","копотунья","копоть","копошение","копра","копт","коптение","коптилка","коптильня","коптильщик","коптильщица","коптитель","копты","копулировка","копуляция","копун","копунья","копуша","копчение","копчения","копчёнка","копчёности","копчёность","копчик","копчушка","копыл","копытень","копытка","копытные","копыто","копытце","копь","копьё","копьеметатель","копьеметательница","копьеносец","копьецо","кора","корабел","корабельник","корабельщик","кораблевождение","кораблекрушение","корабленник","кораблестроение","кораблестроитель","кораблестроительство","кораблик","корабль","коралёк","коралл","коральки","Коран","корвалол","корвет","корд","корда","кордебалет","кордегардия","кордиамин","кордовой","кордодром","кордон","кордонный","кореец","корейка","корейцы","коренастость","коренная","коренник","коренной","корень","коренья","кореш","корешки","корешок","кореянка","корж","коржик","корзина","корзинка","корзиноплетение","корзиночка","корзинщик","корзинщица","корзно","кориандр","коридор","коридорная","коридорный","коридорчик","коринка","корифей","корифейка","корица","коричневатость","корка","корм","корма","кормач","кормачка","кормёжка","кормилец","кормилица","кормило","кормишко","кормление","кормленщик","кормовой","кормовые","кормозапарник","кормокухня","кормоцех","кормушка","кормчий","кормщик","корневище","корненожка","корненожки","корнеплод","корнеплоды","корнер","корнерезка","корнеслов","корнесловие","корнет","корнет-а-пистон","корнетик","корнетист","корнетша","корнишон","короб","коробейка","коробейник","коробейничек","коробейничество","коробка","коробление","коробовка","коробок","коробочек","коробочка","коробочник","коробочница","коробья","корова","коровёнка","коровка","коровник","коровница","коровушка","коровяк","короед","королева","королевич","королевна","королевство","королёк","короли","король","коромысло","корона","коронация","коронка","коронование","коронограф","короночка","корообдирка","корообдирщик","короста","коростелёк","коростель","коротковолновик","короткометражка","коротконожка","короткость","коротыш","коротышка","корочка","корпение","корпия","корпоративность","корпорация","корпуленция","корпункт","корпус","корпускула","корпусник","корректив","корректирование","корректировка","корректировщик","корректность","корректор","корректорская","корректорша","корректура","коррекция","коррелят","коррелятивность","корреляция","корреспондент","корреспондентка","корреспонденция","корреспондирование","корригирование","коррида","коррозия","коррумпированность","коррупция","корсаж","корсажница","корсак","корсар","корсарство","корсет","корсетка","корсетница","корт","кортеж","кортесы","кортик","кортома","корунд","корча","корчага","корчажка","корчевалка","корчевание","корчеватель","корчёвка","корчевье","корчевья","корчемник","корчемница","корчемство","корчи","корчма","корчмарка","корчмарь","корчь","коршун","коршунёнок","коршунок","коршуньё","корыстность","корыстолюбец","корыстолюбие","корысть","корытник","корытничий","корыто","корытце","корь","корьё","корючение","корюшка","корюшковые","корявость","коряга","коряжина","коряжка","коряжник","коряк","коряки","корячение","корячка","коса","косарь","косатка","косатки","косач","косая","косвенность","косеканс","косец","косилка","косина","косинка","косинус","косица","косичка","космач","косметик","косметика","косметичка","косметолог","косметология","космовидение","космогонист","космогония","космограф","космография","космодром","космолог","космология","космонавт","космонавтика","космонавтка","космоплавание","космополит","космополитизм","космополитка","космополиты","косморама","космос","космы","косник","косное","косность","косноязычие","косноязычность","кособокость","косоватость","косовица","косовище","косоворотка","косоглазие","косоглазость","косоглазый","косогор","косогорчик","косогорье","косой","косок","косолапость","косолапый","косонька","косорукость","косослой","косослойность","косость","косоугольник","костёл","костёр","костёрик","костерок","костёрчик","костерь","кости","костистость","костлявая","костлявость","костоеда","костолом","костоломка","костоправ","костоправка","косторез","косточка","косточковые","костра","кострец","кострика","кострище","костровой","костык","костылёк","костылик","костыль","кость","костюм","костюмер","костюмерная","костюмерша","костюмишко","костюмчик","костяк","костяника","костянка","костяшка","косулёнок","косуля","косуха","косушечка","косушка","косхалва","косынка","косыночка","косынька","косьба","косьё","косяк","косячник","косячок","кот","котангенс","котёл","котелок","котельная","котельник","котёльчик","котельщик","котёнок","котёночек","котерия","котик","котики","котиколов","котильон","котировка","котище","котлета","котлетка","котлован","котловина","котловинка","котлостроение","коток","котома","котомка","котомочка","котонизация","котофей","коттедж","коттеджик","котурн","котурны","коты","кофе","кофеварка","кофеёк","кофеёчек","кофей","кофеин","кофейная","кофейник","кофейница","кофейничек","кофеинка","кофейня","кофеишко","кофемолка","кофешенк","кофий","кофр","кофта","кофтёнка","кофточка","коханка","коханочка","кохинхина","кохинхинка","коча","кочан","кочевание","кочёвка","кочевник","кочевники","кочевница","кочевничество","кочевье","кочегар","кочегарка","кочегарная","кочегарня","кочедыжник","кочедык","кочень","кочерга","кочерёжка","кочерыга","кочерыжка","кочет","кочеток","кочешок","кочка","кочкари","кочкарник","кочковатость","кочкорез","кочь","кош","кошара","кошатина","кошатник","кошатница","кошачьи","кошева","кошевая","кошевина","кошёвка","кошевой","кошелёк","кошелёчек","кошёлка","кошёлочка","кошель","кошение","кошениль","кошенина","кошечка","кошка","кошки","кошки-мышки","кошкодав","кошкодёр","кошма","кошмар","кошница","кошомка","кошт","кошурка","кощей","кощунство","коэффициент","краб","крабик","краболов","крабы","кравчий","крага","краги","краденое","краевед","краеведение","краешек","кража","край","краина","крайность","краковяк","кралечка","краля","крамбамбули","крамола","крамольник","крамольничество","кран","кранец","краник","краниология","краниометрия","крановщик","крановщица","крап","крапива","крапивка","крапивник","крапивница","крапивные","крапивушка","крапина","крапинка","краплак","крапление","крапп","крапчатость","краса","красава","красавец","красавица","красавка","красавушка","красавчик","красивое","красивость","красильная","красильня","красильщик","красильщица","краситель","краска","краски","красковар","красковарная","красковарня","краскотёр","краскотёрка","красная","красненькая","красненькое","краснина","краснинка","красноармеец","красноармейка","краснобай","краснобайка","краснобайство","красногвардеец","красноглинье","красноголовик","краснодеревец","краснодеревщик","краснозём","краснокожий","красно-коричневые","красно-коричневый","краснолесье","краснолицая","краснолицый","красномордая","красномордый","красноногий","красноножка","красноносая","красноносый","краснопёрка","краснопёрый","красноречивость","красноречие","краснорожий","краснорядец","краснословие","краснота","краснотал","краснофлотец","краснуха","красные","красота","красотища","красотка","красоточка","красоты","красочка","красочность","кратер","кратера","кратковременность","краткосрочность","краткость","кратное","кратность","крах","крахмал","крахмаление","крахмалистость","крачка","крашение","крашенина","краюха","краюшка","креатура","креветка","креветки","кредит","кредитив","кредитка","кредитование","кредитор","кредитоспособность","кредо","крез","Крез","крейсер","крейсерство","крейсирование","крейцер","крекер","крекинг","крекирование","крем","креманка","крематорий","кремация","крем-брюле","кремень","кремешок","кремирование","Кремль","кремль","кремнёвка","кремнезём","кремний","кремнистость","крем-сода","крен","кренделёк","крендель","крендельная","крендельщик","крендельщица","кренометр","креозот","креол","креолка","креп","крепдешин","крепёж","крепильщик","крепитель","крепление","крепостная","крепостник","крепостничество","крепостной","крепостца","крепость","крепыш","крепышка","крепь","кресало","кресельце","кресла","креслице","кресло","кресло-кровать","кресс","кресс-салат","крест","крестец","крести","крестик","крестины","креститель","крестишко","крёстная","крестник","крестница","крестничек","крёстный","крестовина","крестовка","крестовник","крестоносец","крестоцветные","крестьянин","крестьянка","крестьянство","кретин","кретинизм","кретинка","кретон","кречет","кречётка","крешендо","крещёная","крещендо","крещение","Крещение","крещёный","кривая","кривда","кривизна","кривина","кривинка","кривляка","кривляние","кривобокость","криводушие","криводушник","криводушница","кривой","криволесье","криволинейность","кривоножка","кривосудие","кривотолк","кривотолки","кривошей","кривошейка","кривошея","кривошип","кривулина","кривулька","кривуля","кривуша","криз","кризис","крик","крикет","крикливость","крикун","крикунья","крикуха","крикуша","криль","криминал","криминалист","криминалистика","криминальность","криминолог","криминология","кримплен","крин","криница","криничка","кринка","кринолин","криночка","крипта","криптогамия","криптограмма","криптография","криптомерия","криптон","кристалл","кристаллизатор","кристаллизация","кристаллик","кристалличность","кристаллограф","кристаллография","кристальность","критерий","критериум","критик","критика","критикан","критиканка","критиканство","критикант","критиканша","критицизм","критичность","крица","кричание","кроат","кроатка","кроаты","кров","кровавик","кроватка","кровать","кровелька","кровельщик","кроветворение","кровинка","кровиночка","кровинушка","кровишка","кровища","кровка","кровля","кровник","кровное","кровность","кровные","кровожадность","кровоизлияние","кровомщение","кровообращение","кровоочищение","кровопивец","кровопиец","кровопийство","кровопийца","кровоподтёк","кровопролитие","кровопускание","кровосмеситель","кровосмесительница","кровосмесительство","кровосмешение","кровосос","кровотечение","кровоток","кровоточивость","кровохаркание","кровохлёбка","кровушка","кровь","кроение","крой","кройка","крокет","кроки","крокирование","крокировка","крокодил","крокодильчик","крокус","кролик","кроликовод","кролиководство","кроликоматка","кроль","крольчатина","крольчатник","крольчиха","крольчонок","кроманьонец","кроманьонцы","кромешник","кромка","кромлех","кромочка","кромсание","крон","крона","кронверк","кронглас","кронпринц","кронпринцесса","кронциркуль","кроншнеп","кронштейн","кропание","кропатель","кропательница","кропило","кропильница","кропление","кропотливость","кропотун","кропотунья","кросна","кросно","кросс","кроссворд","кроссовка","кроссовки","крот","кроталы","кротёнок","кротовина","кротость","кроха","крохаль","крохи","крохобор","крохоборка","крохоборничество","крохоборство","крохоборчество","крохотка","крохотность","крошанка","кроше","крошево","крошение","крошечка","крошильщик","крошка","крошонка","круг","кругловина","круглогубцы","круглоличка","круглоротые","круглость","круглота","круглыш","кругляк","кругляш","кругляшок","круговерть","круговина","круговорот","круговращение","кругозор","кругооборот","кругообращение","кругосветка","кружало","кружева","кружевница","кружево","кружевца","кружевце","кружение","кружечка","кружка","кружковец","кружковщина","кружок","кружочек","круиз","крумциркуль","круп","крупа","крупеник","крупина","крупинка","крупица","крупка","крупник","крупность","крупнота","круповейка","крупорушка","крупорушня","крупчатка","крупье","крутизна","крутик","крутильщик","крутильщица","крутка","крутоверть","крутогор","крутость","крутояр","круть","круча","кручение","кручёнка","кручина","кручинушка","кручь","крушение","крушина","крушинник","крушинные","крушиновые","крушитель","крыжовник","крыжовниковые","крылан","крылатка","крылатость","крылатые","крылечко","крыло","крылышко","крыльца","крыльце","крыльцо","крымчанин","крынка","крыночка","крыса","крысёнок","крысолов","крысоловка","крыша","крышечка","крышка","крюйт-камера","крюк","крючковой","крючкотвор","крючкотворец","крючкотворство","крючник","крючок","крючочек","крючочник","крюшон","кряж","кряжик","кряжина","кряжистость","кряк","крякание","кряква","кряковая","кряковная","крякуша","крякушка","кряхтение","кряхтун","кряхтунья","ксёндз","ксении","ксенон","ксерография","ксерокопия","ксерокс","ксероформ","кси","ксилит","ксилограф","ксилография","ксилолит","ксилофон","ктитор","куафёр","куафюра","куб","кубанка","кубарь","кубатура","кубизм","кубик","кубики","кубинец","кубинка","кубинцы","кубист","кубло","кубовая","кубовщик","кубок","кубометр","кубрик","кубышечка","кубышка","кувалда","кувейтец","кувейтка","кувейтцы","куверт","кувшин","кувшинец","кувшинка","кувшинковые","кувшинчик","кувыркание","кувырколегия","кувырок","куга","кугуар","кудахтание","кудель","куделька","кудёрышки","кудерьки","кудесник","кудесница","кудесничество","кудла","кудлы","кудреватость","кудри","кудрявость","кудрявчик","кудряш","кудряшка","кудряшки","кузен","кузина","кузнец","кузнечество","кузнечик","кузнечиковые","кузнечиха","кузница","кузня","кузов","кузовня","кузовок","кузовщик","кузька","кукан","кукарача","кукарекание","кукельван","кукиш","кукла","куклёнок","кукловод","ку-клукс-клан","куклуксклановец","кукование","куколка","куколь","кукольник","кукольница","кукона","куконица","кукуль","кукуруза","кукурузник","кукурузовод","кукурузоводство","кукурузосажалка","кукушечка","кукушица","кукушка","кукушонок","кукша","кулага","кулак","кулан","кулачество","кулачина","кулачиха","кулачишко","кулачище","кулачка","кулачник","кулачок","кулачонок","кулачьё","кулебяка","кулёк","кулёма","кулёмка","кулёчек","кулеш","кули","кулига","кулижка","кулик","кулики","кулинар","кулинария","кулинарка","кулиса","кулисы","кулич","куличик","куличок","куличонок","кулон","кулончик","култышка","кулуар","кулуары","кулугур","кулугурка","куль","кульбаба","кульбит","кульман","кульминация","культ","культиватор","культивация","культивирование","культпоход","культпроп","культпросветработа","культпросветработник","культработа","культработник","культтовары","культура","культуризм","культурист","культуристка","культурник","культурница","культурничество","культуртрегер","культуртрегерство","культя","культяпка","кум","кума","куманёк","куманика","кумач","кумган","кумжа","кумир","кумирня","кумовство","кумоха","кумуляция","кумушка","кумык","кумыки","кумыс","кумысник","кумысолечебница","кумысолечение","кумычка","кумышка","кун","кунак","кунацкая","куначество","кунгас","кунжут","кунжутные","куница","кунктатор","кунсткамера","кунтуш","кунштюк","куньи","купа","купава","купавка","купаж","Купала","купаленка","Купало","купальник","купальница","купальничек","купальня","купальщик","купальщица","купание","купаты","купе","купейность","купелирование","купель","купеляция","купена","купец","купечество","Купидон","купило","купина","купирование","куплево","куплет","куплетец","куплетик","куплетист","куплетистка","куплеты","купля","купля-продажа","купол","куполок","купон","купончик","купорос","куприт","купчая","купчик","купчина","купчиха","купчишка","купырь","купюра","кур","кура","курабье","курага","кураж","курай","курант","куранта","куранты","кураре","куратор","кураторство","курбет","курган","курганчик","кургауз","кургузка","курд","курды","курдюк","курдючок","курдянка","курево","куренёк","курение","куренной","курёнок","курень","курец","куржак","курзал","курилка","курильная","курильница","курильня","курильщик","курильщица","куриные","курирование","куритель","курительная","курительница","курица","курия","курка","куркуль","куркума","курлыкание","курник","курносая","курносый","куровод","куроводство","курок","куролесица","куропатка","куропатковые","куропаточка","курорт","курортник","курортница","курортолог","курортология","курослеп","курослепник","куроцап","курочек","курочка","курпей","курпяй","курс","курсант","курсантка","курсив","курсирование","курсист","курсистка","курсовая","курсовка","курсовой","курсовочник","курсы","куртаг","куртаж","куртажные","куртизанка","куртизанство","куртина","куртинка","куртка","курточка","куртуазность","курултай","курумы","курухтан","курфирст","курфиршество","курфюрст","курфюрстина","курфюршество","курцгалоп","курчавинка","курчавка","курчавость","курчатовий","курчонка","курчонок","куры","курьёз","курьёзность","курьер","курьерский","курьерство","курьерша","курья","куряка","курятина","курятинка","курятник","курятница","курятня","курящий","кус","кусака","кусание","кусачка","кусачки","кусище","кусок","кусочек","куст","кустарник","кустарничек","кустарничество","кустарность","кустарщина","кустарь","кустарь-одиночка","кустик","кустистость","кустище","кустование","кустовка","кустод","кустодий","кустодия","кусток","кусторез","кусточек","кут","кутание","кутас","кутафья","кутёж","кутейник","кутейница","кутёнок","кутерьма","кутила","кутник","куток","кутора","куточек","кутровые","кутузка","кутум","куть","кутья","кутюрье","куфа","кухарка","кухарь","кухва","кухлянка","кухмистер","кухмистерская","кухмистерша","кухня","кухоль","кухонька","кухта","куча","кучер","кучерёнок","кучериха","кучеришка","кучерская","кучерявость","кучка","кучность","куш","кушак","кушанье","кушачок","кушетка","кушеточка","куща","кущение","кхекание","кхмер","кхмерка","кхмеры","кьянти","кьят","кэк-уок","кювет","кюветка","кюммель","кюрасо","кюре","кюри","кюрий","кюрин","кюринец","кюринка","кюринцы","кюрины","лабаз","лабазник","лабазница","лабардан","лабет","лабиализация","лабиализованность","лабиальность","лабиальный","лабильность","лабио-дентальность","лабио-дентальный","лабиринт","лабиринтовые","лабиринтодонты","лаборант","лаборантка","лаборантская","лаборатория","лабораторка","лабрадор","лабрадорит","лава","лаванда","лаваш","лавина","лавинка","лавинорез","лавинщик","лавирование","лавировка","лавка","лавочка","лавочник","лавочница","лавочничество","лавр","лавра","лавровишня","лавровые","лаврушка","лавры","лавсан","лавчонка","лавчушка","лаг","лагерник","лагерница","лагерь","лаглинь","лагун","лагуна","лад","лада","ладан","ладанка","ладанник","ладанниковые","ладность","ладонка","ладонь","ладоша","ладоши","ладошка","ладошки","ладушка","ладушки","лады","ладья","лаж","лажа","лаз","лазание","лазарет","лазеечка","лазейка","лазер","лазерщик","лазея","лазка","лазок","лазоревка","лазурит","лазурность","лазурь","лазутчик","лазутчица","лазы","лай","лайба","лайда","лайдак","лайка","лайнер","лак","лакание","лакей","лакейская","лакейство","лакеишка","лакейщина","лаки","лакировальщик","лакировальщица","лакирование","лакировка","лакировки","лакировщик","лакировщица","лакколит","лакмус","лаковар","лакомка","лакомство","лаконизм","лаконичность","лакрица","лакричник","лактация","лактобациллин","лактобациллы","лактоза","лактометр","лактоскоп","лакуна","лакфиоль","лакцы","лал","лама","ламаизм","ламаист","ламаит","ламантин","ламаркизм","ламаркист","ламбда","ламбрекен","ламентации","ламентация","ламинария","лампа","лампа-вспышка","лампада","лампадка","лампадочка","лампас","лампасы","лампион","ламповая","ламповщик","ламповщица","лампочка","ламут","ламутка","ламуты","ламы","лан","лангет","лангобарды","лангуст","лангуста","ландвер","ландграф","ландграфиня","ландграфство","ландкарта","ландо","ландрат","ландрин","ландскнехт","ландтаг","ландшафт","ландштурм","ландштурмист","ланды","ландыш","ланита","ланиты","ланка","ланкорд","ланолин","ланочка","лансада","лансье","лантан","ланцет","ланцетник","лань","лаосец","лаоска","лаосцы","лаотяне","лаотянец","лаотянин","лаотянка","лаотянцы","лапа","лапание","лапидарность","лапилли","лапища","лапка","лапки","лапландец","лапландка","лапландцы","лапник","лапонька","лапотник","лапотница","лапоток","лапоточек","лапоть","лапочка","лапсердак","лапта","лаптишко","лаптище","лапушка","лапчатка","лапша","лапшевник","лапшенник","лапшичка","лапшовник","лар","ларго","ларёк","ларец","ларёчек","ларёчник","ларёчница","ларингит","ларинголог","ларингология","ларингоскоп","ларингоскопия","ларингофон","ларчик","лары","ларь","ларьёвщик","ларьёвщица","ласа","ласина","ласка","ласкание","ласкатель","ласкательность","ласкательство","ласковость","лассо","ласт","ластик","ластовица","ластовка","ластоногие","ласточка","ласты","латание","латания","латвиец","латвийка","латвийцы","латекс","латентность","латеральность","латеральный","латерит","латинец","латинизация","латинизм","латинист","латинистка","латиница","латинка","латиноамериканец","латиноамериканка","латиноамериканцы","латинский","латинство","латинцы","латинщина","латины","латиняне","латинянин","латинянка","латифундизм","латифундист","латифундия","латка","латник","латочка","латук","латунь","латы","латынщик","латынь","латыш","латыши","латышка","лаун-теннис","лауреат","лауреатка","лауреатство","лафа","лафет","лафит","лафитник","лахтак","лацкан","лаццарони","лачка","лачуга","лачужечка","лачужка","лаяние","лбина","лбишко","лбище","лганьё","лгун","лгунишка","лгунище","лгунья","лебеда","лебедёнок","лебёдка","лебёдушка","лебёдчик","лебёдчица","лебедь","лебедятина","лебезение","лебяжина","лев","Лев","левада","левак","левантин","левачество","левиафан","левизна","левират","левит","левкас","левкой","левобережье","левофланговый","левретка","левулёза","левша","левые","левый","легавые","легавый","легализация","легальность","легат","легато","легаш","леггорн","леггорнка","легенда","легендарность","легион","легионер","легирование","легислатура","легитимация","легитимизм","легитимист","легитимистка","легитимность","лёгкие","легкоатлет","легкоатлетка","легковатость","легковер","легковерие","легковерность","легковес","легковесие","легковесность","легковушка","легкодум","лёгкое","легкомысленник","легкомысленность","легкомыслие","легкоплавкость","легкораненая","легкораненый","легкорастворимость","лёгкость","легкоумие","лёгость","лёгочник","лёгочница","лёд","леденение","леденец","леденчик","ледерин","леди","ледник","ледничек","ледничок","ледобур","ледовитость","ледовоз","ледогенератор","ледозащита","ледоисследователь","ледок","ледокол","ледокольщик","ледолом","ледообразование","ледопад","ледоплав","ледорез","ледоруб","ледосброс","ледоспуск","ледостав","ледоход","ледохранилище","ледочек","ледышка","ледянка","ледяшка","леер","леечка","лежак","лежание","лежанка","лежаночка","лежачая","лежачий","лежачок","лежбище","лежебока","лежебокство","лежебочество","лежебочина","лежень","лёжка","лёжкость","лежнёвка","леза","лезвие","лезгин","лезгинец","лезгинка","лезгинцы","лезгины","леи","лей","лейб-гвардеец","лейб-гвардия","лейб-медик","лейборизм","лейборист","лейка","лейкемия","лейкоз","лейкома","лейкопения","лейкопластырь","лейкоцит","лейкоцитоз","лейкоциты","лейтенант","лейтенантик","лейтенантишка","лейтенантша","лейтмелодия","лейтмотив","лек","лекало","лекальщик","лекальщица","лекариха","лекаришка","лекарка","лекарство","лекарствоведение","лекарша","лекарь","лексема","лексика","лексикограф","лексикография","лексиколог","лексикология","лексикон","лексикончик","лектор","лекторий","лекториум","лектория","лекторская","лекторство","лекторша","лектриса","лектура","лекции","лекция","лелеяние","лелеятель","лемеш","лемма","лемминг","лемур","лемуры","лен","лён","лендлорд","лендлордство","ленивая","ленивец","ленивица","ленивость","ленивый","ленинец","лениниана","ленинизм","ленник","лёновые","ленок","леность","лента","ленто","лентопрокатчик","лентотека","ленточка","ленточник","ленточница","лентяй","лентяйка","лентяйничание","лентяйство","ленца","ленч","ленчик","лень","леопард","лепесток","лепесточек","лепет","лепетание","лепетун","лепетунья","лепёха","лепёшечка","лепёшечник","лепёшка","лепидодендрон","лепильщик","лепка","лепление","лепнина","лепота","лепра","лепрозорий","лепролог","лепта","лепщик","лепщица","лерка","лес","леса","лесбиянка","лесенка","лесина","лесинка","лесистость","лесишко","лесище","леска","лесник","лесничество","лесничий","лесничиха","лесоакадемия","лесобаза","лесобиржа","лесование","лесоведение","лесовик","лесовина","лесовладелец","лесовод","лесоводство","лесовоз","лесовозобновление","лесовой","лесовосстановление","лесовщик","лесовывозка","лесовыращивание","лесогон","лесоделянка","лесозавод","лесозаготовитель","лесозаготовка","лесозаготовки","лесозаготовщик","лесозащита","лесоистребление","лесок","лесокомбинат","лесокультура","лесоматериал","лесоматериалы","лесомелиоратор","лесомелиорация","лесонасаждение","лесоохрана","лесоочистка","лесопарк","лесоперевалка","лесопиление","лесопилка","лесопильня","лесопильщик","лесопитомник","лесоповал","лесоповальщик","лесопогрузка","лесопогрузчик","лесополоса","лесопользование","лесопорубка","лесопосадка","лесопосев","лесопромышленник","лесопромышленность","лесопункт","лесоразведение","лесоразработка","лесоразработки","лесоруб","лесорубщик","лесосека","лесосклад","лесоснабженец","лесосплав","лесоспуск","лесостепь","лесотаска","лесотехник","лесотехникум","лесоторговец","лесоторговля","лесотундра","лесоукладчик","лесоустройство","лесоустроитель","лесоучасток","лесохимик","лесохимия","лесочек","лесоэксплуатация","лесоэкспорт","леспедеца","леспромхоз","лёсс","лессирование","лессировка","лестница","лестничка","лестное","лестность","лестовка","лесть","лесхоз","лёт","Лета","лета","летальность","летание","летаргия","лётка","летка-енка","летнаб","летник","летники","лето","летовка","летоисчисление","леток","летописание","летописец","летопись","летосчисление","летун","летуны","летунья","летучесть","летучка","лётчик","лётчик-испытатель","лётчик-космонавт","лётчица","летяга","лецитин","лецитины","лечебник","лечебница","лечение","лечо","лешак","лешачина","лешачиха","леший","лешовка","лещ","лещадь","лещик","лещина","лещотка","лея","лжа","лжеискусство","лжеклассицизм","лженаука","лжеприсяга","лжепророк","лжепророчество","лжесвидетель","лжесвидетельница","лжесвидетельство","лжетеория","лжетолкование","лжеучение","лжеучёный","лжеучитель","лжец","лживость","ли","лиана","либерал","либерализм","либералка","либеральничание","либеральничество","либеральность","либериец","либерийка","либерийцы","либерти","либреттист","либреттистка","либретто","ливан","ливанец","ливанка","ливанцы","ливенка","ливень","ливер","ливерная","ливнеотвод","ливнеспуск","ливнесток","ливонец","ливонцы","ливр","ливрея","лига","лигатура","лигирование","лигнин","лигнит","лигроин","лидер","лидерство","лидирование","лизание","лизания","лизин","лизис","лизоблюд","лизоблюдник","лизоблюдница","лизоблюдничание","лизоблюдство","лизол","лизосома","лизосомы","лизоцим","лизун","лизунец","лизунья","лик","ликбез","ликвидатор","ликвидаторство","ликвидация","ликвидирование","ликвидность","ликёр","ликёрец","ликёрчик","ликование","ликоподий","ликтор","ликтрос","лилейные","лилея","лилипут","лилипутик","лилипутка","лилия","лиловатость","лиловость","лиман","лимб","лимит","лимита","лимитация","лимитирование","лимитчик","лимитчица","лимнолог","лимнология","лимон","лимонад","лимонад-газес","лимонадчик","лимонарий","лимонка","лимонник","лимонница","лимоновка","лимончик","лимузин","лимфа","лимфаденит","лимфатик","лимфоцит","лимфоциты","лингвист","лингвистика","лингвистка","линеечка","линейка","линейный","линейщик","линёк","линемёт","линеметатель","линза","линийка","линия","линкор","линкос","линкруст","лино","линобатист","линовальщик","линование","линовка","линовщик","линогравюра","линолеум","линолеумщик","линометатель","линотип","линотипист","линотипистка","линотипия","линотрон","линт","линчевание","линчеватель","линь","линька","линючесть","линяние","липа","липец","липка","липкость","липник","липняк","липовец","липовка","липовые","липома","липочка","липси","липучесть","липучка","лира","лиризм","лирик","лирика","лиричность","лирник","лирохвост","лис","лиса","лисель","лисель-спирт","лисёнок","лисица","лисичка","лиска","лисовин","лисогон","лисонька","лисоферма","лисохвост","лиссабон","лист","листаж","листва","лиственит","лиственница","лиственничник","листвень","листвие","листвяг","листвяк","листик","листоблошка","листобой","листовёртка","листовка","листовуха","листодёр","листоед","листок","листокатальная","листокатальный","листонос","листоносы","листопад","листопадник","листопрокатка","листопрокатчик","листорез","листочек","листье","лисятник","литавра","литаврист","литаврщик","литавры","литания","литва","литвин","литвинка","литвины","литгруппа","литейка","литейная","литейный","литейщик","литейщица","литер","литера","литератор","литераторство","литераторша","литература","литературка","литературовед","литературоведение","литературщик","литературщина","литерник","литий","лития","литка","литмонтаж","литник","литовец","литовка","литовцы","литограф","литографирование","литография","литографская","литографщик","литология","литораль","литорея","литосфера","литр","литраж","литровка","литровочка","литсотрудник","литургия","литфак","литфонд","литчасть","литьё","лиф","лифт","лифтёр","лифтёрша","лифтоподъёмник","лифчик","лихач","лихачество","лихва","лихо","лиходей","лиходейка","лиходейство","лихоимец","лихоимство","лихолетье","лихоманка","лихорадка","лихорадочная","лихорадочность","лихорадочный","лихость","лихота","лихтер","лихтеровоз","лицевание","лицедей","лицедейка","лицедейство","лицезрение","лицей","лицеист","лицеистик","лицеистка","лицемер","лицемерие","лицемерка","лицемерность","лицемерство","лицензирование","лицензия","лицеприязнь","лицеприятие","лицо","лицовка","личико","личина","личинка","личное","личности","личность","лишай","лишайник","лишек","лишение","лишения","лишнее","лоб","лобан","лобанчик","лобастик","лобби","лоббизм","лоббист","лоббистка","лобзание","лобзик","лобик","лобогрейка","лобогрейщик","лобок","лоботряс","лоботряска","лобызание","лов","ловелас","ловец","ловитель","ловитки","ловитор","ловкач","ловкачество","ловкачка","ловкость","ловля","ловушка","ловчак","ловчий","ловчила","лог","логарифм","логарифмирование","логгер","логик","логика","логист","логистика","логичность","логовина","логовинка","логовище","логово","логогриф","логопат","логопатия","логопед","логопедия","лоделаванд","лоджия","лодка","лодочка","лодочки","лодочник","лодочница","лодчонка","лодыга","лодыжка","лодыжки","лодырничание","лодырничество","лодырь","ложа","ложбина","ложбинка","ложбиночка","ложе","ложемент","ложечка","ложечки","ложечник","ложка","ложкарь","ложки","ложкомойка","ложница","ложноклассицизм","ложноногие","ложноножка","ложноножки","ложность","ложок","ложь","лоза","лозина","лозинка","лозник","лозняк","лознячок","лозоплетение","лозунг","локализация","локальность","локатор","локаторщик","локаут","локаутированная","локаутированный","локаутчик","локация","локомобиль","локомотив","локомотивщик","локон","локончик","локотник","локоток","локоточек","локоть","лом","ломака","ломаная","ломание","ломбард","ломбер","ломик","ломка","ломкость","ломовик","ломовой","ломонос","ломота","ломотца","ломоть","ломтерезка","ломтик","ломщик","лонгет","лонгетка","лонгшез","лонжа","лонжерон","лонлакей","лоно","лончак","лопание","лопари","лопарка","лопарь","лопасть","лопата","лопатище","лопатка","лопатник","лопатоногие","лопатонос","лопаточка","лопаточник","лопотание","лопотня","лопотун","лопотунья","лопотуха","лопоухость","лопух","лопушник","лопушняк","лопушок","лорд","лорд-канцлер","лорд-мэр","лордоз","лордство","лоретка","лори","лорнет","лорнетка","лорнирование","лосёнок","лосеферма","лосина","лосины","лосиха","лоск","лоскут","лоскутик","лоскутник","лоскутница","лоскутность","лоскуток","лоскуточек","лоскутье","лоскутья","лоснистость","лососёвые","лососина","лососка","лосось","лось","лосьон","лосятина","лосятник","лот","лотерейщик","лотерея","лотлинь","лото","лотовой","лоток","лотос","лотоха","лоточек","лоточник","лоточница","лотошник","лотошница","лох","лоханка","лохань","лохматость","лохмач","лохмотник","лохмотница","лохмоток","лохмотье","лохмотья","лохмы","лоховина","лоховые","лоция","лоцман","лоцманство","лошадёнка","лошади","лошадиные","лошадка","лошадник","лошадница","лошадность","лошадный","лошадушка","лошадь","лошак","лошачиха","лошачок","лошонок","лощение","лощилка","лощило","лощильня","лощильщик","лощильщица","лощина","лощинка","лояльность","луб","лубок","лубочник","лубянка","луг","луговедение","луговина","луговинка","луговка","луговод","луговодство","лугомелиоратор","лугомелиорация","лугорез","луддит","луддиты","лудильщик","лудильщица","лужа","лужайка","лужение","лужина","лужица","лужичане","лужичанин","лужичанка","лужища","лужок","луза","лузга","лузгание","луидор","лук","лука","лукавец","лукавинка","лукавица","лукавость","лукавство","Лукавый","луковина","луковица","луковка","луковочка","луковые","лукоморье","лукошечко","лукошко","Луна","луна","луна-парк","луна-рыба","лунатизм","лунатик","лунатичка","лунит","лунища","лунка","лункование","лункокопатель","лунник","лунность","лунопроходец","лунотрясение","луноход","луночка","лунь","лупа","лупка","лупление","луфарь","луч","лучезарность","лучеиспускание","лучение","лучепреломление","лучи","лучик","лучина","лучинка","лучиночка","Лучинушка","лучинушка","лучистость","лучишко","лучник","лучница","лучок","лучшее","лучший","лущёвка","лущение","лущильник","лущильщик","лыжа","лыжероллер","лыжероллеры","лыжи","лыжина","лыжник","лыжница","лыжня","лыко","лыкодёр","лысатик","лысёна","лысина","лысинка","лысун","лысуха","лысый","лытка","лытки","лычки","лычко","львёнок","львица","львятник","льгота","льготник","льготница","льготность","льдина","льдинка","льдистость","льдогенератор","льдодробилка","льдообразование","льды","льдышка","лье","льновод","льноводка","льноводство","льноводчество","льноволокно","льнозавод","льнокомбайн","льнокомбинат","льномялка","льноочиститель","льнопрядение","льнопрядильня","льнопрядильщик","льнопрядильщица","льносемя","льносолома","льносушилка","льносырьё","льнотеребилка","льнотёрка","льнотрепалка","льнотреста","льночесалка","льнянка","льстец","льстивость","льяло","льяносы","льячка","люба","любая","любвеобильность","любезная","любезник","любезничание","любезности","любезность","любезный","любимая","любимец","любимица","любимчик","любимый","любисток","любитель","любительница","любительство","любительщина","любка","любование","любовник","любовница","любовность","любовь","любое","любознание","любознательность","любой","любомудр","любомудрие","любоначалие","любопытная","любопытное","любопытный","любопытство","любопытствующая","любопытствующий","любослов","любострастие","любостяжание","любостяжатель","любостяжательница","любота","любочестие","любушка","любящий","люд","люди","людишки","людкость","людность","людоед","людоедка","людоедство","людская","люизит","люк","люкарна","люковый","люкс","люксметр","люлечка","люлька","люля-кебаб","люмбаго","люминал","люминесценция","люминофор","люминофоры","люмпен","люмпен-пролетариат","люмпен-пролетарий","люнель","люнет","люнетта","люпин","люпозорий","люпус","люрекс","люрик","люстра","люстрация","люстрин","лютеране","лютеранин","лютеранка","лютеранство","лютеций","лютик","лютиковые","лютнист","лютня","лютование","лютость","люфа","люфт","люффа","люцерна","Люцифер","лючина","лючок","люэс","ля","лявониха","лягавый","лягание","лягва","лягуха","лягушатина","лягушатник","лягушечка","лягушка","лягушонок","ляда","лядвея","лядина","лядинка","лядунка","ляжка","лязг","лязгание","ля-ля","лямка","лямочка","лямочник","ляп","ляпис","ляпис-лазурь","ляпсус","лярва","лярвы","лярд","ляскание","ляссе","лясы","лях","ляхи","ляшка","ма","мавзолей","мавр","мавританец","мавританка","мавританцы","мавры","маг","магазин","магазинка","магазинчик","магазинщик","магазинщица","магараджа","магарыч","магдалина","магизм","магик","магистерство","магистр","магистраль","магистранство","магистрант","магистрат","магистратура","магичность","магия","магма","магматизм","магнат","магнатка","магнатство","магнезит","магнезия","магнетизация","магнетизёр","магнетизёрство","магнетизирование","магнетизм","магнетит","магнето","магнетон","магнетрон","магний","магнит","магнитик","магнитность","магнитограмма","магнитограф","магнитола","магнитолог","магнитология","магнитометр","магнитосфера","магнитотерапия","магнитофон","магнитуда","магнитчик","магничение","магнолиевые","магнолия","Магомет","магометанец","магометанин","магометанка","магометанство","мадам","мадама","мадаполам","мадемуазель","мадера","мадерка","мадерца","мадонна","Мадонна","мадригал","мадригалист","мадьяр","мадьярка","мадьяры","маёвка","маета","маетность","маечка","мажара","мажор","мажордом","мажорность","маз","мазальщик","мазальщица","мазание","мазанка","мазар","маздеизм","мазепа","мазер","мазик","мазила","мазилка","мазильщик","мазильщица","мазка","мазло","мазница","мазня","мазок","мазочек","мазур","мазурик","мазурист","мазуристка","мазурка","мазурничество","мазурщик","мазуры","мазут","мазчик","мазь","май","майдан","майданщик","майер","майка","майна","майник","майолика","майонез","майор","майоран","майорат","майоратство","майордом","майорство","майорша","маис","майя","мак","макака","макаль","макальщик","макальщица","маканец","макание","маканка","макао","макаронизм","макаронина","макаронник","макаронщик","макаронщица","макароны","маквис","македонец","македонка","македонцы","македоняне","македонянин","македонянка","макет","макетирование","макетчик","макетчица","маки","макиавеллизм","макиавеллист","макинтош","макитра","макияж","маккия","маклак","маклачение","маклачество","маклачка","маклер","маклерство","маклок","маковина","маковица","маковка","маковник","маковуха","маковые","макогон","макотра","макраме","макрелевые","макрель","макрокинетика","макроклимат","макрокосм","макрокосмос","макромир","макропод","макроподы","макрорайон","макрорельеф","макроструктура","макрофаг","макрофаги","макрофотография","макрофотосъёмка","макроцефал","макроцефалия","макрурус","макрурусы","макса","макси","максим","максима","максимализм","максималист","максималистка","максимальность","максимизация","максимилизация","максимум","макулатура","макуха","макуша","макушка","мала","малага","малагасиец","малагасийка","малагасийцы","малаец","малайзиец","малайзийка","малайзийцы","малайка","малайцы","малахай","малахит","малахитчик","малахольная","малахольный","малевание","малёк","маленькая","маленький","малец","малик","малина","малинина","малинка","малинник","малиновка","малиновое","малиновость","малица","малка","маловажность","маловер","маловерие","маловерка","маловероятность","маловесность","маловодность","маловодье","маловыгодность","маловыразительность","малогабаритность","малограмотная","малограмотность","малограмотный","малодойка","малодоступность","малодоходность","малодушество","малодушие","малодушная","малодушный","малое","малозаметность","малоземелье","малоземельность","малознакомая","малознакомое","малознакомый","малозначимость","малозначительность","малоизвестная","малоизвестность","малоизвестный","малоизученность","малоимущая","малоимущий","малокалиберка","малокалорийность","малокровие","малолесье","малолетка","малолетний","малолетник","малолетники","малолетняя","малолеток","малолетство","малолитражка","малолюдность","малолюдство","малолюдье","маломерка","маломерок","маломощность","малонаселённость","малооблачность","малоопытность","малопитательность","малоплодие","малоплодность","малоподвижность","малоприбыльность","малопродуктивность","малопулька","малоразговорчивость","малоречивость","малоросс","малороссияне","малороссиянин","малороссиянка","малоросска","малороссы","малорус","малоруска","малорусы","малосемейная","малосемейность","малосемейный","малословие","малоснежность","малоснежье","малосостоятельность","малоспособная","малоспособный","малость","малотиражность","малоудойность","малоумие","малоупотребительность","малоурожайность","малоуспешность","малоформист","малоценность","малочисленность","малоэффективность","малый","малыш","малышка","малышня","малышок","мальбек","мальборо","мальва","мальвазия","мальвовые","мальё","мальма","мальпост","мальство","мальтиец","мальтийка","мальтийцы","мальтоза","мальтузианец","мальтузианство","мальчик","мальчишеское","мальчишество","мальчишечка","мальчишка","мальчишник","мальчишня","мальчонка","мальчонок","мальчоночек","мальчуга","мальчуган","мальчугашка","малютка","малюточка","малявка","малявочка","маляр","малярик","маляриолог","малярия","мама","Мамай","мамалыга","маман","маманька","маманя","мамаша","мамашенька","мамашка","мамба","мамбо","мамелюк","маменька","мамзель","мамзелька","мамка","мамлюк","Мамон","мамона","Мамона","мамонт","мамонтиха","мамонька","мамочка","мамочкин","мамуля","мамура","мамуся","мамушка","манатки","манатья","мангал","мангалка","манганин","манганит","мангль","манго","мангольд","мангостан","мангрова","мангры","мангуст","мангуста","мандант","мандарин","мандаринка","мандаринник","мандаринчик","мандат","мандатарий","мандола","мандолина","мандолинист","мандолинистка","мандрагора","мандраж","мандрил","маневр","манёвр","маневренность","манёвренность","маневрирование","манёвры","манеж","манежик","манекен","манекенша","манекенщик","манекенщица","манер","манера","манерка","манерничание","манерность","манеры","манжета","манжетка","маниакальность","мание","манизм","маникюр","маникюрша","манилла","манилов","маниловщина","маниок","маниока","манипулирование","манипулятор","манипуляторщик","манипуляция","манифест","манифестант","манифестантка","манифестация","манишка","мания","манка","манкирование","манкировка","манко","манна","манник","мановение","манок","манометр","мансарда","манси","мансиец","мансийка","мансийцы","мант","мантель","мантилька","мантилья","мантисса","мантия","манто","манты","манул","манускрипт","мануфактура","мануфактурист","мануфактур-советник","мануфактурщик","манчестер","манчестерец","манчестерство","маны","маньеризм","маньерист","маньчжур","маньчжурка","маньчжуры","маньяк","маньячество","маньячка","маоизм","маоист","маоистка","маори","маориец","маорийка","маорийцы","мар","марабу","марабут","маразм","маразматик","марал","марала","маралёнок","мараловод","мараловодство","маралуха","маральник","маран","марание","маранта","марантовые","мараны","мараскин","маратель","марательница","маратхи","марафет","марафон","марафонец","марафонка","марашка","марганец","марганцовка","маргарин","маргаритка","маргинал","маргиналии","маргиналия","маргинальность","марго","марево","маревые","марена","маренго","мареновые","мареограф","марзан","мари","мариец","марийка","марийцы","марина","маринад","маринизм","маринист","маринка","маринование","мариновка","мариновщик","мариновщица","марионетка","марихуана","марка","марказит","маркграф","маркграфиня","маркграфство","маркер","маркёр","маркёрство","маркетинг","маркетри","маркиз","маркиза","маркизет","маркирование","маркировка","маркировщик","маркировщица","маркитант","маркитантка","маркитантство","маркость","марксизм","марксизм-ленинизм","марксист","марксистка","маркшейдер","маркшейдерия","маркшейдерство","марля","мармелад","мармеладец","мармеладина","мармеладка","мармор","марморация","мародёр","мародёрка","мародёрство","марокен","марокканец","марокканка","марокканцы","марочка","марочник","марочность","Марс","марс","марсала","марселин","марсель","Марсельеза","марсиане","марсианин","марсианка","марсовой","март","мартен","мартеновец","мартенщик","мартингал","мартини","мартинизм","мартинист","мартинисты","мартиролог","мартирологий","мартирология","мартын","мартышка","мартышковые","марципан","марш","маршал","маршальство","марш-бросок","маршевик","маршевость","маршик","марширование","маршировка","марш-марш","маршрут","маршрутизация","марь","марьяж","марьянник","масаи","маседуан","маска","маскарад","маскарон","маскирование","маскированная","маскированный","маскировка","маскировщик","маскхалат","масла","Масленая","масленик","Масленица","масленица","маслёнка","маслёнок","маслёнщик","маслина","маслинка","маслиновые","маслице","масличные","маслишко","масло","маслобойка","маслобойня","маслобойщик","маслодел","маслоделие","маслодельня","маслозавод","маслюк","маслянистость","маслянка","масон","масонка","масонство","масоны","масса","массаж","массажист","массажистка","массив","массивность","массирование","массированность","массировка","массовик","массовичка","массовка","массовость","масс-спектрометр","масс-спектрометрия","массы","мастак","мастер","мастерица","мастерище","мастеровитость","мастеровой","мастерок","мастерская","мастерские","мастерство","мастика","мастит","маститость","мастихин","мастодонт","мастоидит","масть","масштаб","масштабность","мат","матадор","мателот","математизация","математик","математика","математичка","материал","материалец","материализация","материализм","материалист","материалистичность","материалистка","материаловед","материаловедение","материалоёмкость","материальность","материальчик","материйка","материк","материнство","материя","матерок","матерщина","матерщинник","матерщинница","матерь","Матерь","матерьялец","матине","матирование","матировка","матица","матка","маткина-душка","матлот","матовость","маточник","матрадур","матрадура","матрас","матрасик","матрасник","матрац","матрацник","матрёшка","матриархат","матрикул","матрица","матрицирование","матрона","матрос","матросик","матросиха","матроска","матросня","маттиола","матуха","матушка","матч","матчасть","матчиш","матч-турнир","мать","мать-и-мачеха","мать-мачеха","мать-одиночка","матюг","матюгание","матюк","матюкание","маузер","мафиози","мафиозо","мафия","мафусаил","мах","махалка","махало","махальщик","махан","махание","маханина","махаон","махизм","махина","махинатор","махинаторство","махинация","махинища","махист","махновец","махновщина","маховик","маховичок","махонькая","махонький","махорка","махорочка","махотка","махоточка","махра","махровость","махры","маца","мацерация","мацони","мачете","мачеха","мачта","мачтовка","мачтовник","мачтовой","машбюро","машерочка","машина","машинальность","машинерия","машинешка","машинизация","машинизирование","машинист","машинистка","машинка","машинность","машиновед","машиноведение","машиновладелец","машинопись","машиностроение","машиностроитель","маштак","маштачок","маэстозо","маэстро","маюскулы","маяк","маяние","маятник","маячник","маячок","мга","мгла","мглистость","мгновение","мгновения","мгновенность","меандр","мебелишка","мебель","мебельщик","мебельщица","меблирашки","меблировка","меблировщик","мегалит","мегалополис","мегаполис","мегаспора","мегафон","мегера","мегрел","мегрелка","мегрелы","мёд","медалист","медалистка","медаль","медальер","медалька","медальон","медальончик","медальщик","медбрат","медведик","медведина","медведиха","медведица","медведище","медведка","медведко","медведушка","медведь","медведюшка","медвежатина","медвежатинка","медвежатник","медвежатушки","медвежеватость","медвежина","медвежковатость","медвежонок","медвежоночек","медвежьи","медвуз","медеплавильщик","меджлис","медиана","медиатор","медиация","медиеваль","медиевист","медиевистика","медиевистка","медик","медикамент","медикаменты","мединститут","медитация","медиум","медиумизм","медицина","медичка","медкомиссия","медление","медленность","медлитель","медлительность","меднение","медник","медницкая","меднолитейщик","медноплавильщик","медовар","медоварение","медоварка","медоварня","медовик","медовка","медовуха","медогон","медогонка","медок","медонос","медоносность","медосбор","медосмотр","медосос","медоточивость","медперсонал","медпункт","медработник","медресе","медсанбат","медсестра","медуза","медуница","медь","медяк","медяница","медянка","медяшка","межа","межбровье","межгорье","междометие","междоузлие","междоумок","междоусобие","междоусобица","междувластие","междугородная","междугородняя","междугорье","международник","междуначалие","междупарье","междупутье","междуречье","междурядье","междусобойчик","междуцарствие","межевание","межевик","межёвка","межевой","межевщик","межень","межеумок","межеумье","межклетник","межклеточник","межник","межплодник","межсезонье","межусобица","мезальянс","мезга","мездра","мездрение","мезентерий","мезенхима","мезоглея","мезодерма","мезозой","мезон","мезонин","мезонинчик","мезотрон","мейстерзингер","мекание","мекка","мексиканец","мексиканка","мексиканцы","мел","меламед","меланж","меланин","меланхолик","меланхоличка","меланхоличность","меланхолия","меласса","мелево","меледа","меленка","мелизма","мелизмы","мелинит","мелиоратор","мелиорация","мелисса","мелитоза","мелкобуржуазность","мелководность","мелководье","мелкодушие","мелкозём","мелкозернистость","мелкозубка","мелкокалиберка","мелколепестник","мелколесье","мелкоплодность","мелкосерийность","мелкосопочник","мелкость","мелкота","мелкотемье","мелкотравчатый","мелкотравье","мелодекламатор","мелодекламация","мелодийка","мелодика","мелодист","мелодичность","мелодия","мелодрама","мелодраматизм","мелодраматичность","мелок","меломан","меломания","меломанка","мелос","мелочишка","мелочник","мелочность","мелочь","мель","мелькание","мельник","мельники","мельница","мельничиха","мельничка","мельтешение","мельтешня","мельхиор","мелюзга","мембрана","мемекание","меморандум","мемориал","мемория","мемуарист","мемуаристка","мемуары","мена","менада","менгир","менделизм","менделист","менеджер","менеджмент","менестрель","мензула","мензура","мензурка","менингит","мениск","менка","меновщик","менонит","менонитка","менониты","менструация","мент","менталитет","ментик","ментол","ментор","менуэт","меньшак","меньшая","меньшевизм","меньшевик","меньшевичка","меньшее","меньшенькая","меньшенький","меньшинство","меньшой","меню","меняла","меняльщик","мера","мергель","мерёжа","мережка","мерёжка","меренга","мерехлюндия","мерзавец","мерзавка","мерзавчик","мёрзлость","мерзлота","мерзлотность","мерзлотовед","мерзлотоведение","мерзляк","мерзлячка","мерзость","меридиан","мерило","мерильщик","мерильщица","мерин","меринок","меринос","меристема","меритель","мерка","меркантилизм","меркантилист","меркантильность","мерклость","Меркурий","меркурий","мерланг","мерлушка","мерность","мероприятие","мерочка","мерсеризация","мёртвая","мертвенность","мертвец","мертвецкая","мертвечина","мёртвое","мертвоед","мертвоеды","мертворождённая","мертворождённость","мертворождённый","мёртвый","мертвяк","мертвятина","мерцание","мерщик","меры","меря","месиво","месилка","месильщик","месильщица","месмеризм","месса","мессалина","мессианизм","мессианство","мессия","места","местечко","местишко","местная","местничество","местность","местный","место","местоблюститель","местожительство","местоимение","местонахождение","местообитание","местоположение","местопребывание","месторасположение","месторождение","месть","месье","месяц","месяцеслов","месяцок","месячина","месячишко","месячник","месячные","мета","метагалактика","металл","металлизация","металлист","металличность","металловед","металловедение","металлограф","металлография","металлоёмкость","металлоид","металлолом","металлообработка","металлопласт","металлопромышленность","металлофон","металлург","металлургия","метальщик","метальщица","метамерия","метаморфизация","метаморфизм","метаморфоз","метаморфоза","метан","метание","метастаз","метастазирование","метатеза","метатель","метательница","метафизик","метафизика","метафизичность","метафора","метафоричность","метафраза","метацентр","метелица","метёлка","метёлочка","метель","метельщик","метельщица","метемпсихоз","метемпсихоза","метение","метеор","метеоризм","метеорит","метеорограф","метеоролог","метеорология","метеосводка","метеослужба","метеоспутник","метеостанция","метизация","метизы","метил","метилен","метина","метинка","метис","метисация","метиска","метка","мётка","меткость","метла","метлика","метлица","метод","метода","методизм","методика","методист","методистка","методичка","методичность","методкабинет","методолог","методология","метол","метонимичность","метонимия","меточка","метр","метраж","метранпаж","метрдотель","метреска","метресса","метрика","метрики","метрит","метро","метровка","метролог","метрология","метроман","метромания","метроном","метрополитен","метрополия","метростроевец","метростроевка","метрострой","метчик","Мефистофель","мех","механизатор","механизация","механизм","механик","механика","механист","механистичность","механицизм","механицист","механическая","механический","механичность","механотерапия","мехлюдия","меховщик","меховщица","мехоед","мехоноша","меценат","меценатка","меценатство","меццо","меццо-сопрано","меццо-тинто","меч","мечение","меченосец","мечеть","мечехвост","меч-кладенец","мечник","меч-рыба","мечта","мечтание","мечтатель","мечтательница","мечтательность","мечты","мешалка","мешальщик","мешальщица","мешание","мешанина","мешанинка","мешанка","мешкание","мешковатость","мешковина","мешкота","мешкотность","мешок","мешочек","мешочник","мешочница","мешочничество","мещане","мещанин","мещанка","мещаночка","мещанство","мещера","мещеряк","мещеряки","мещерячка","мзда","мздоимец","мздоимство","ми","миазмы","миальгия","миастения","миг","мигалка","мигалки","мигание","мигач","мигрант","мигранты","миграция","мигрень","миди","мидия","миелин","миелит","мизансцена","мизантроп","мизантропия","мизантропка","мизгирь","мизер","мизерность","мизинец","мизинчик","микадо","микитки","миколог","микология","микориза","микроавтобус","микроб","микробиолог","микробиология","микровесы","микрогэс","микроинсульт","микроинфаркт","микрокалькулятор","микроклимат","микрококк","микрококки","микрокосм","микрокосмос","микролитражка","микролиты","микромер","микрометеорит","микрометр","микрометрия","микроминиатюризация","микромир","микрон","микроорганизм","микроорганизмы","микропорка","микропроцессор","микрорайон","микрорельеф","микроскоп","микроскопирование","микроскопичность","микроскопия","микроструктура","микротом","микрофауна","микрофильм","микрофильмирование","микрофлора","микрофон","микрофотография","микрофотосъёмка","микрохимия","микрохирургия","микроцефал","микроцефалия","микроэлектроника","микроэлемент","микроэлементы","миксер","микст","микстура","микстурка","милачок","милаша","милашечка","милашка","милая","миледи","милёнок","миленькая","миленький","милитаризация","милитаризм","милитарист","милицейский","милиционер","милиционерша","милиция","милка","миллиамперметр","миллиард","миллиардер","миллиардерша","миллиардная","миллиардный","миллиарды","милливольтметр","миллиграмм","миллиметр","миллиметровка","миллимикрон","миллион","миллионер","миллионерка","миллионерша","миллионная","миллионный","миллиончик","миллионщик","миллионщица","миллионы","милование","миловидность","милое","милок","милорд","милосердие","милостивец","милостивица","милостынька","милостыня","милость","милочка","милушка","милый","мильеранизм","мильт","мильтон","миля","миляга","мим","миманс","мимеограф","мимик","мимика","мимикрия","мимист","мимистка","мимоза","мимозовые","мимолётность","мина","минарет","мингрел","мингрелец","мингрелка","мингрелы","мингрельцы","миндалевые","миндалик","миндалина","миндалины","миндаль","миндальник","миндальничание","миндальности","миндальность","миндальные","минеи-четьи","минёр","минерал","минерализатор","минерализация","минералка","минералог","минералогия","Минерва","мини","миниатюра","миниатюризация","миниатюрист","миниатюристка","миниатюрность","минимализм","минималист","минималистка","минимальность","миниметр","минимизация","минимум","минирование","министерство","министерша","министр","миннезанг","миннезингер","минога","миноговые","миноискатель","Минологий","миномёт","миномётчик","миноносец","миноноска","минор","минорка","минорность","Минотавр","минреп","минтай","минувшее","минус","минускул","минускулы","минута","минутка","минуточка","миньон","миограф","миозин","миозит","миокард","миокардий","миокардит","миолог","миология","миома","миопия","миоцен","мир","мираб","мирабель","мирабилит","мираж","миракль","мирандоль","мирволение","мирение","мирза","мириада","мириады","мирика","миритель","мирительница","мирность","миро","мировая","мировоззрение","мировой","мировосприятие","мироед","мироедство","мироздание","мирок","миролюбец","миролюбивость","миролюбие","мирон","мироносица","мироощущение","миропознание","миропомазание","миропомазанник","миропомазанница","миропонимание","миропорядок","миросозерцание","миротворец","миротворица","миротворство","миротворчество","мироустройство","мирр","мирра","мирское","мирской","мирт","мирта","миртовые","миряне","мирянин","мирянка","миса","миска","мисочка","мисс","миссионер","миссионерка","миссионерство","миссис","миссия","мистагог","мистагогия","мистер","мистерия","мистик","мистика","мистификатор","мистификация","мистифицирование","мистицизм","мистичка","мистичность","мистраль","мистрис","мисюрка","митенка","митенки","митинг","митингование","митинговщина","миткаль","митоз","митра","Митра","митраизм","митральеза","митрополит","митрополия","митрофан","митрофанушка","миттель","миттельшпиль","миф","мифичность","мифолог","мифология","мифотворчество","михрютка","мицелий","мицелла","мицеллы","мичман","мичманка","мичманство","мичуринец","миша","мишари","мишарь","мишень","мишенька","мишка","мишук","мишура","мишурность","младенец","младенчество","младенчик","младогегельянец","младогегельянство","младограмматизм","младограмматик","младограмматики","младость","младшая","младшенькая","младшенький","младший","млат","млеко","млекопитающее","млекопитающие","мление","млечник","млечники","мнемоник","мнемоника","мнемотехника","мнение","мненьице","мнимость","мнимоумершая","мнимоумерший","мнительность","мних","многие","многобожие","многоборец","многоборка","многоборье","многобрачие","многовластие","многоводность","многоводье","многоглаголание","многогласие","многоголосие","многоголосность","многогранник","многогранность","многодетность","многодомность","многое","многоженец","многожёнство","многоземелье","многоземельность","многознайка","многознайство","многознаменательность","многозначительное","многозначительность","многозначность","многозуб","многоклеточные","многоколенчатые","многокрасочность","многократность","многолемешник","многолесье","многолетник","многолетники","многоликость","многолюдность","многолюдство","многолюдье","многомерность","многомужество","многомужие","многонаселённость","многонациональность","многоначалие","многоногие","многоножка","многоножки","многообразие","многообразность","многоопытность","многопартийность","многоплановость","многоплодие","многоплодность","многополье","многопредметность","многопрограммность","многоречивость","многосемейная","многосемейность","многосемейный","многослов","многословие","многословность","многосложность","многослойность","многосменность","многоснежность","многоснежье","многостаночник","многостаночница","многостепенность","многосторонность","многотиражка","многотиражность","многотомность","многоточие","многоуважаемая","многоуважаемый","многоугольник","многоустка","многофигурность","многоцветница","многоценность","многочисленность","многочлен","множественность","множество","множимое","множитель","мобилизация","мобилизм","мобилизованная","мобилизованность","мобилизованный","мобиль","мобильность","моветон","могар","могикане","могиканин","могиканка","могила","могилка","могильник","могильщик","могол","моголы","могота","могутность","могучая","могучесть","могучий","могущественность","могущество","мода","модальность","моделизм","моделирование","моделировка","моделист","моделистка","модель","модельер","модельерша","моделька","модельщик","модельщица","модерато","модератор","модерн","модернизатор","модернизация","модернизирование","модернизм","модернизование","модернист","модернистка","моджахед","модий","модильон","модистка","модисточка","модификатор","модификация","модифицирование","модник","модница","модничание","модности","модность","модулирование","модуль","модульон","модулятор","модуляция","модус","моё","моёвка","моечная","можжевелина","можжевеловая","можжевёловая","можжевеловка","можжевёловка","можжевель","можжевельник","можжуха","мозазавр","мозаика","мозаист","мозаичист","мозаичник","мозаичность","мозг","мозги","мозгля","мозгляк","мозель","мозельвейн","мозжечок","мозолистость","мозоль","мои","мой","мойва","мойка","Мойра","мойра","мойщик","мойщица","мокасин","мокасины","мокко","мокой","мокрец","мокрица","мокричник","мокропогодица","мокроступ","мокроступы","мокрота","мокрядь","мокша","мокшане","мокшанин","мокшанка","мол","молва","молвь","молдаване","молдаванин","молдаванка","молдовеняска","молебен","молебствие","молебщик","молебщица","молевщик","молекула","молельная","молельня","молельщик","молельщица","моление","моленная","молескин","молибден","молибденит","молитва","молитвенник","молитвенница","молитвослов","молитвословие","молитель","молитовка","молка","моллюск","моллюски","молниеносность","молниеотвод","молния","молодайка","молодая","молодёжь","молоденькая","молоденький","молодец","молодечество","молодило","молодица","молодка","молодняк","молодогвардеец","молодогвардейцы","молодожён","молодожёны","молодо-зелено","молодой","молодость","молодуха","молодушка","молодцеватость","молодчага","молодчик","молодчина","молодые","молодь","молодяжник","молодятник","моложавость","молозиво","молока","молокан","молокане","молоканин","молоканка","молоканство","молоки","молоко","молоковоз","молокомер","молокопоставка","молокопоставки","молокосос","молонья","молот","молотилка","молотило","молотильня","молотильщик","молотильщица","молотобоец","молотовище","молоток","молоточек","молот-рыба","молотьба","молох","Молох","молочай","молочайник","молочайные","молочение","молочишко","молочко","молочная","молочник","молочница","молочное","молочность","молчаливость","молчалин","молчалинство","молчальник","молчальница","молчальничество","молчание","молчанка","молчок","молчун","молчунья","моль","мольба","мольберт","мольбище","мольва","молян","моляр","молярность","моляры","молящаяся","молящийся","момент","моментальность","монада","монадология","монарх","монархизм","монархиня","монархист","монархистка","монархия","монастырёк","монастырка","монастырские","монастырь","монах","монахиня","монацит","монашек","монашена","монашенка","монашество","монашествующий","монашка","монгол","монголист","монголистика","монголистка","монголка","монголовед","монголоведение","монголы","мондиализм","мондиалист","мондиалистка","монета","монетаризм","монетарист","монетаристка","монетка","монетчик","монизм","монимаска","монист","монистичность","монисто","монитор","мониторинг","моноволокно","моногамия","монограмма","монография","монокль","монокристалл","монокультура","монолит","монолитность","монолог","мономан","мономания","мономанка","монометаллизм","моноплан","монополизация","монополизирование","монополизм","монополист","монополистка","монополия","монополька","монопольность","монорельс","монотеизм","монотеист","монотип","монотипист","монотипистка","монотипия","монотипы","монотония","монотонность","монофтонг","монофтонгизация","монохорд","монохром","монохромия","моноцит","моноциты","монпансье","монсеньёр","монстера","монстр","монструозность","монтаж","монтажёр","монтажист","монтажистка","монтажник","монтажница","монтаньяр","монтаньяры","монтекристо","монтёр","монтирование","монтировка","монтировщик","монтировщица","монумент","монументалист","монументальность","монументщик","моншер","мопед","мопс","мопсик","мор","морализаторство","морализация","морализирование","морализм","моралист","моралистка","моралите","мораль","моральность","мораторий","морг","моргалик","моргалка","моргание","морганизм","морген","моргун","моргунья","морда","мордастая","мордастый","мордасы","мордаха","мордаш","мордашка","мордва","мордвин","мордвинка","мордвины","мордобитие","мордобой","мордобойство","мордовец","мордовка","мордоворот","мордовцы","мордочка","море","морель","морена","морение","мореплавание","мореплаватель","морепродукт","морепродукты","моретрясение","мореход","мореходец","мореходка","мореходность","мореходство","морж","моржиха","моржовые","моржонок","морзист","морзянка","морилка","морильщик","мориск","мориски","морковина","морковка","морковник","морковь","Мормон","мормон","мормонизм","мормонка","мормонство","мормоны","мормыш","мормышка","морожение","мороженица","мороженник","мороженое","мороженщик","мороженщица","мороз","морозец","морозик","морозилка","морозильник","морозище","морозко","морозник","морозность","морозобоина","морозостойкость","морозоупорность","морозоустойчивость","морозы","морок","морока","морось","морочение","морошка","морс","мортира","морф","Морфей","морфей","морфема","морфий","морфин","морфинизм","морфинист","морфинистка","морфолог","морфология","морфонология","морцо","морщина","морщинистость","морщинка","морюшко","моряк","моряна","морянка","морячка","морячок","москали","москаль","москатель","москательщик","москвитяне","москвитянин","москвитянка","москит","москитка","московит","московиты","московка","московочка","мослак","мослачок","мосол","мосолок","мост","мостик","мостильщик","мостишко","мостище","мостки","мостовая","мостовик","мостовина","мостовник","мостовщик","мостовьё","мосток","мостолыга","мостолыжка","мостоотряд","мостопоезд","мостостроение","мостостроитель","мосточек","мосье","моська","мот","моталка","мотальня","мотальщик","мотальщица","мотание","мотель","мотет","мотив","мотивация","мотивирование","мотивированность","мотивировка","мотивчик","мотишка","мотка","мотня","мотобол","мотоболист","мотобот","мотовелосипед","мотовило","мотовильце","мотовильщик","мотовильщица","мотовка","мотовоз","мотовство","мотогонки","мотогонщик","мотогонщица","мотодрезина","мотодром","моток","мотоклуб","мотоколонна","мотокросс","мотолодка","мотоотсек","мотопатруль","мотопехота","мотопехотинец","мотопробег","мотор","моторалли","моторесурс","моторизация","моторика","моторист","мотористка","моторка","моторность","мотороллер","моторостроение","моторчик","моторщик","мотоцикл","мотоциклет","мотоциклетка","мотоциклист","мотоциклистка","моточасть","моточек","мотто","мотыга","мотыжение","мотылёк","мотылёчек","мотыль","мотыльковые","мох","мохер","мохна","мохнатка","мохнатость","мохнач","мохны","моховик","моховина","мохообразные","моцион","моча","мочага","мочажина","мочалка","мочало","мочевина","мочевыделение","мочеизнурение","мочеиспускание","мочеистощение","мочение","моченька","мочеотделение","мочеточник","мочеточники","мочило","мочка","мочушка","мочь","мошенник","мошенница","мошенничество","мошенство","мошка","мошкара","мошна","мошник","мошница","мошонка","моща","мощение","мощи","мощности","мощность","мощь","моя","мраз","мразь","мрак","мракобес","мракобесие","мракобеска","мрамор","мраморирование","мраморировка","мраморист","мраморность","мраморщик","мрачноватость","мрачность","мститель","мстительница","мстительность","мсье","му","муар","муар-антик","муаре","мудрая","мудрёность","мудрец","мудрила","мудрование","мудрость","мудрствование","мудрый","муж","мужание","мужеложство","мужелюбие","муженёк","мужененавистница","мужененавистничество","мужественность","мужество","мужеубийство","мужеубийца","мужик","мужиковатость","мужичество","мужичина","мужичишка","мужичище","мужичка","мужичок","мужичонка","мужичонко","мужичьё","мужлан","мужчина","мужчинище","мужчинка","муза","музга","музеевед","музееведение","музей","музей-квартира","музеум","музикус","музицирование","музыка","музыкальность","музыкант","музыкантик","музыкантша","музыковед","музыковедение","музыкознание","мука","мука-обойка","муковоз","мукоед","мукомол","мукомолье","мукомольня","мукосей","муксун","мул","мулат","мулатка","мулине","мулиха","мулица","мулла","муллит","мульда","мультик","мультимиллионер","мультипликатор","мультипликация","мультфильм","мульча","мульчирование","муляж","муляжист","мумиё","мумификация","мумия","мундир","мундиришко","мундирчик","мундшенк","мундштук","мундштучок","муниципал","муниципализация","муниципалитет","муниципий","муниципия","мура","мурава","муравей","муравейник","муравель","муравельник","муравка","муравление","муравушка","муравьед","муравьишка","муравьище","муравьятник","мураш","мурашка","мурашки","мурена","мурза","мурин","Мурин","мурло","мурлыка","мурлыкание","мурмолка","мурома","мурцовка","мурчание","мурья","мускат","мускатель","мускат-люнель","мускатник","мусковит","мускул","мускулатура","мускулистость","мускулы","мускус","муслин","муслин-де-лен","муслин-де-лень","мусор","мусоропровод","мусорщик","мусорщица","мусс","муссирование","муссировка","муссон","муст","мустанг","мусульман","мусульманин","мусульманка","мусульманство","мутаген","мутагенез","мутагенность","мутака","мутант","мутация","мутник","мутноватость","мутность","мутовка","мутон","муть","муфель","муфельщик","муфлон","муфта","муфти","муфтий","муфточка","муха","мухаммеданин","мухаммеданка","мухаммеданство","мухобойка","мухолов","мухоловка","мухомор","мухортик","мухояр","муцин","муцины","мучение","мученик","мученица","мученичество","мучитель","мучительница","мучительность","мучительство","мучица","мучка","мучник","мучнистое","мучнистость","мучное","мушар","мушинка","мушка","мушкара","мушкет","мушкетёр","мушкетон","мушмула","муштабель","муштра","муштрование","муштровка","муэдзин","мхи","мшаник","мшанка","мшанки","мшистость","мщение","мыза","мызник","мык","мыкание","мыленка","мылкость","мыло","мыловар","мыловарение","мыловарня","мыльница","мыльня","мыльнянка","мыльце","мыльщик","мыльщица","мымра","мыс","мысик","мыслебоязнь","мыслёнка","мысленность","мыслете","мысли","мыслитель","мыслишка","мысль","мысок","мыт","мытарства","мытарство","мытарь","мытник","мыто","мытьё","мычание","мычка","мышей","мышелов","мышеловка","мышехвостник","мышка","мышкование","мышление","мышонок","мышоночек","мышца","мышь","мышьяк","мыщелка","мыщелок","мэр","мэрия","мэтр","мюзет","мюзикл","мюзик-холл","мюнхгаузен","мюон","мюрид","мюридизм","мюскадель","мягкий","мягкосердечие","мягкосердечность","мягкосердие","мягкость","мягкотелость","мягкотелые","мягчение","мякина","мякинка","мякинник","мякиш","мякоть","мялка","мяло","мяльня","мяльщик","мямля","мянда","мясистость","мясник","мясное","мясной","мясность","мясо","Мясоед","мясоед","мясозаготовка","мясозаготовки","мясокомбинат","мясопоставка","мясопоставки","мясопродукты","Мясопуст","мясорубка","мясохладобойня","мясцо","мята","мятеж","мятежник","мятежница","мятежность","мятлик","мятьё","мяукание","мяч","набавка","набавщик","набавщица","набалдашник","набалованность","набальзамирование","набат","набатчик","набег","набегание","набедренник","набережная","набережье","набивальщик","набивальщица","набивание","набивка","набивщик","набивщица","набирание","наблюдатель","наблюдательница","наблюдательность","наблюдение","набоб","набожность","набойка","набойная","набойник","набойщик","набойщица","наболевшее","набор","наборная","наборщик","наборщица","набрасывание","наброска","набросок","набрызгивание","набрюшник","набухание","набухлость","набучивание","навага","наваждение","навал","наваливание","навалка","навалоотбойка","навалоотбойщик","навальщик","навальщица","навар","наваривание","наварка","наваха","наващивание","навевание","наведение","навеивание","навёрстывание","навёртка","навёртывание","наверчивание","навес","навесец","навесик","навеска","навет","наветник","наветница","наветчик","наветчица","навешивание","навещание","навивальщик","навивальщица","навивание","навивка","навигатор","навигация","навильник","навинчивание","навис","нависание","навислость","навись","навиток","наводка","наводнение","наводняемость","наводчик","наводчица","наводящий","навоз","навозец","навозка","навозник","навозница","навозня","навозоразбрасыватель","навозохранилище","навой","наволок","наволока","наволочка","наволочь","навык","навь","навьючивание","навязень","навязка","навязчивость","навязывание","навяливание","нагаечка","нагайка","наган","нагар","нагель","нагиб","нагибание","наглаживание","наглазник","наглец","наглеца","наглинка","наглость","наглядка","наглядность","нагнаивание","нагнёт","нагнетание","нагнетатель","нагнетение","нагнивание","нагноение","наговор","наговорщик","наговорщица","наголовник","нагон","нагонка","нагоняй","нагораживание","нагорание","нагорье","нагота","награбление","награбленное","награда","наградные","награждение","нагребальщик","нагребальщица","нагребание","нагрев","нагревальщик","нагревальщица","нагревание","нагреватель","нагретость","нагромождение","нагромождённость","нагрудник","нагрузка","нагрузчик","нагрузчица","нагрыжник","нагул","нагуливание","надавливание","надаивание","надбавка","надбровница","надбровье","надворный","надворье","надвязка","надвязывание","надглавие","надглавок","надгортанник","надгробие","наддув","надевание","надежда","надёжность","надел","наделение","наделённость","надеянность","надзирание","надзиратель","надзирательница","надзирательская","надзирательство","надзор","надир","надкалывание","надклассовость","надклеивание","надклейка","надклёпка","надклёпывание","надклювье","надкожица","надкол","надколенник","надкопытье","надкостница","надкрылье","надкрылья","надкус","надламывание","надлобье","надлом","надломленность","надмение","надменность","надобность","надоеда","надоедала","надоедание","надоедливость","надой","надолб","надолба","надолбы","надомник","надомница","надорванность","надоумление","надоумливание","надпереносье","надпил","надпилка","надпиловка","надписание","надписка","надписывание","надпись","надпочечник","надрез","надрезание","надрезец","надрезывание","надруб","надрубка","надругание","надругатель","надругательница","надругательство","надрыв","надсад","надсада","надсечка","надсмешка","надсмотр","надсмотрщик","надсмотрщица","надставка","надстройка","надстройщик","надсыпка","надув","надувала","надувальщик","надувальщица","надувание","надувательство","надувка","надульник","надуманность","надутость","надхвостье","надхрящница","надшивание","надшивка","наезд","наездка","наездник","наездница","наездничество","наезжая","наезжий","наём","наёмка","наёмник","наёмница","наёмничество","наёмщик","наёмщица","нажатие","наждак","наждачник","наждачница","наждачок","нажёвывание","нажива","наживание","наживка","наживщик","наживщица","нажиг","нажигание","нажим","нажимание","нажин","назализация","назатыльник","название","названьице","назём","наземник","назидание","назидательность","назначаемость","назначенец","назначение","назначенка","назначенство","назначенчество","назойливость","назола","назревание","назубок","называние","наиб","наибство","наивничание","наивность","наигранность","наигрывание","наигрыш","найдёныш","наилок","наименование","наймит","наймитка","наймичка","наймодатель","наитие","найтов","найтовка","наказ","наказание","наказуемая","наказуемость","наказуемый","наказывание","накал","накаливание","накалывание","накаляемость","накапливание","накат","накатка","накатник","накатчик","накатчица","накатывание","накачивание","накачка","накашивание","наквашивание","накидка","накидочка","накидывание","накипание","накипь","накисание","наклад","накладка","накладная","накладочка","накладчик","накладчица","накладывание","наклёв","наклёвывание","наклеечка","наклеивание","наклейка","наклейщик","наклейщица","наклёп","наклёпка","наклёпывание","наклеска","наклёска","накликание","наклон","наклонение","наклонная","наклонность","наковаленка","наковальня","наковка","накожник","накол","наколачивание","наколенник","наколка","наколочка","накомарник","накомодник","наконечник","накопитель","накопительница","накопление","накопыльник","накостница","накра","накрап","накрапливание","накрапывание","накрахмаливание","накрашивание","накренивание","накручивание","накры","накрывальщик","накрывальщица","накрывание","накрытие","нактоуз","накуривание","накусывание","налавливание","наладка","наладчик","наладчица","налаженность","налаживание","налегание","наледь","налёжка","налеп","налёт","налётчик","налётчица","налив","наливание","наливка","наливочка","наливщик","наливщица","налим","налипание","налиток","наличие","наличник","наличность","наличные","налобник","налог","налогообложение","налогоплательщик","налогоплательщица","налогоспособность","наложение","наложница","наложничество","налой","налокотник","налокотники","налыгач","намагниченность","намагничивание","намаз","намазка","намазчик","намазчица","намазывание","намалёвывание","наманивание","намасливание","наматрацник","наматывание","намачивание","намащивание","намежёвывание","намёк","намерение","намеренность","намерзание","намерзь","намеривание","наместник","наместница","наместничество","намёт","намётанность","наметка","намётка","намётывание","намин","наминка","намозоливание","намокание","намол","намолачивание","намолвка","намолот","намораживание","намордник","намордничек","наморозь","наморщивание","намост","намотка","намоточник","намоточница","намотчик","намотчица","намыв","намывание","намывка","намывщик","намывщица","намыливание","нанаец","нанаи","нанайка","нанайцы","нанашивание","нанду","нанесение","нани","нанизка","нанизм","нанизывание","нанимание","наниматель","нанимательница","нанка","нанос","нансук","наоконник","нападатель","нападающий","нападение","нападки","нападчик","нападчица","напаивание","напайка","напалзывание","напалм","напалывание","напаривание","напарник","напарница","напарье","напасть","напахивание","напев","напевание","напевность","наперник","наперсник","наперсница","напёрсток","напёрсточек","наперстянка","напечатание","напечатление","напилок","напилочек","напильник","напильничек","написание","напиток","напитывание","наплав","наплавка","наплавливание","наплавок","напластование","наплевательство","наплеск","наплёскивание","наплечник","наплыв","наплывание","напоение","напой","наполеон","наполеондор","наполеонизм","наползание","наполнение","наполненность","наполнитель","наполнительница","напоминание","напоминовение","напор","напористость","направление","направленность","направляющая","направляющий","направщик","направщица","напраслина","напрасность","напрашивание","напревание","напруживание","напружина","напряжение","напряжённость","напудривание","напульсник","напуск","напускание","напутствие","напутствование","напутывание","напухание","напухлость","напучивание","напущение","напыщенность","напяливание","нарастание","наращение","наращивание","нарвал","наргиле","нард","нардек","нарез","нарезальщик","нарезальщица","нарезание","нарезка","нарезчик","нарезчица","нарезывание","нарекание","наречение","нареченная","наречённая","нареченные","наречённые","нареченный","наречённый","наречие","нарзан","нарзанчик","нарицание","наркоз","нарколог","наркология","нарком","наркоман","наркомания","наркомат","наркомафия","наркотизатор","наркотизация","наркотик","наркотики","наркотин","народ","народец","народишка","народишко","народище","народник","народница","народничество","народность","народовед","народоведение","народовластие","народоволец","народоволка","народовольство","народовольчество","народолюбец","народолюбие","народонаселение","народоправие","народоправство","народушка","народушко","нарождение","нарост","нарочитость","нарочный","нарпит","нарпитовец","нарпитовка","нарсуд","нарта","нартучивание","нарты","нарубание","нарубка","наругание","наругатель","наругательница","наругательство","наружное","наружность","нарукавник","нарумянивание","наручи","наручни","наручники","нарушение","нарушитель","нарушительница","нарцеин","нарцисс","Нарцисс","нарциссизм","нары","нарыв","нарывание","нарывник","нарывчик","нарыск","наряд","нарядец","нарядная","нарядница","нарядность","нарядчик","нарядчица","наряжение","насад","насадитель","насадительница","насадка","насадчик","насадчица","насаждение","насаждения","насаживание","насаливание","насаривание","насасывание","насверливание","насвистывание","наседание","наседка","наседочка","насеивание","насека","насекальщик","насекальщица","насекание","насекомое","насекомоядные","насекомые","население","населённость","населитель","населительница","насельник","насест","насесток","насечка","насиживание","насилие","насилование","насильник","насильничание","насильствие","насильство","насильствование","насинивание","насказ","наскакивание","наскок","наслаждение","наслаивание","наследие","наследник","наследница","наследование","наследодатель","наследственность","наследство","наслоение","наслышка","насмаливание","насмехание","насмехательство","насмешечка","насмешка","насмешливость","насмешник","насмешница","насморк","насмотрщик","насмотрщица","насовывание","насос","насосик","насосная","насосчик","насосчица","наспинник","наспиртовывание","наст","наставитель","наставительница","наставительность","наставка","наставление","наставник","наставница","наставничество","настаивание","настёгивание","настил","настилание","настилка","настильность","настильщик","настильщица","настовик","настоечка","настой","настойка","настойчивость","настораживание","настороженность","насторожённость","насторожка","настояние","настоятель","настоятельница","настоятельность","настоятельство","настоящее","настрагивание","настраивание","настрачивание","настриг","настригание","настрижка","настроение","настроенность","настроеньице","настрой","настройка","настройщик","настройщица","наструг","наступ","наступание","наступление","настурция","насупленность","насущность","насып","насыпальщик","насыпальщица","насыпание","насыпка","насыпщик","насыпщица","насыпь","насыщаемость","насыщение","насыщенность","натаивание","наталкивание","натапливание","натаска","натаскивание","натасчик","натачивание","натёк","натекание","нательник","натёс","натёска","натёсывание","нативизм","нативист","натиральщик","натиральщица","натирание","натирка","натирщик","натирщица","натиск","наточка","натр","натравка","натравливание","натравщик","натравщица","натренированность","натрий","натрон","натруска","натуга","натура","натурализация","натурализм","натуралист","натуралистичность","натуральность","натуришка","натурка","натуроплата","натурфилософ","натурфилософия","натурщик","натурщица","натюрморист","натюрморт","натюрмортист","натяг","натягивание","натяжение","натяжка","натянутость","наугольник","наугольничек","наука","науковидность","наукообразность","наукоподобность","наурская","наусник","науститель","наустительница","науськивание","наутофон","научение","научность","наушник","наушники","наушница","наушничание","наушничество","наущение","нафабривание","нафта","нафталин","нафтен","нафтол","нахал","нахалка","нахальничание","нахальность","нахальство","нахваливание","нахвостник","нахимовец","нахимовское","нахлебник","нахлебница","нахлебничество","нахлёст","нахлёстка","нахлёстывание","нахлобучка","нахмуренность","нахмуривание","наход","находка","находочка","находчивость","находчик","находчица","нахождение","нахолаживание","нахрап","нахрапистость","нахрапник","нацеживание","нацеливание","наценка","нацепка","нацизм","национализация","национализм","националист","националистичность","националистка","национальность","нацист","нацистка","нация","нацмен","нацменка","нацменьшинство","начала","начало","начальник","начальница","начальничек","начальничество","начальственность","начальство","начальствование","начальствующий","начатие","начатки","начатое","начаток","начеканивание","начёркивание","начернение","начертание","начерчивание","начёс","начёсывание","начёт","начётец","начётник","начётница","начётничество","начётчик","начётчица","начин","начинание","начинатель","начинательница","начинающая","начинающий","начинение","начинивание","начинка","начиночка","начинщик","начинщица","начисление","начитанность","начитывание","наш","нашатырь","наше","нашейник","нашелец","нашептание","нашёптывание","нашёптыватель","нашест","нашествие","нашесть","наши","нашивание","нашивка","нашивочка","нашильник","нашлемник","нашлёпка","нашпиговывание","наштамповывание","нащупывание","наэлектризованность","наэлектризовывание","Наяда","наяда","наякорник","неаккуратность","неактуальность","неандерталец","небезнадёжность","небезопасность","небезосновательность","небережливость","небеса","небесное","неблаговидность","неблаговоление","неблаговоспитанность","неблагодарная","неблагодарность","неблагодарный","неблагожелательность","неблагожелательство","неблагозвучие","неблагозвучность","неблагонадёжная","неблагонадёжность","неблагонадёжный","неблагонамеренность","неблагообразие","неблагообразность","неблагополучие","неблагопристойность","неблагоприятность","неблагоприятствование","неблагоразумие","неблагорасположение","неблагородство","неблагосклонность","неблагоустроенность","нёбно-зубной","нёбность","нёбный","небо","нёбо","небоеспособность","небожитель","небожительница","небокоптитель","небосвод","небоскат","небосклон","небоскрёб","небрежение","небрежность","небушко","нёбушко","небывалое","небывалость","небывальщина","небылица","небыль","небытие","невеглас","неведение","неведомое","невежа","невежда","невежественность","невежество","невежливость","невезение","невейка","невер","неверие","неверная","неверность","неверный","невероятие","невероятность","неверующая","неверующий","невесёлое","невесомость","невеста","невестка","невестушка","невещественность","невзгода","невзгодье","невзнос","невзрачность","невзрослость","невзыскательность","невидаль","невидальщина","невиданное","невидимка","невидимость","невинная","невинность","невинный","невиноватость","невиновная","невиновность","невиновный","невменяемость","невместность","невмешательство","невнесение","невнимание","невнимательность","невнятица","невнятность","невод","неводник","неводок","неводчик","неводьба","невоенный","невозбудимость","невозвратимость","невозвратное","невозвратность","невозвращенец","невозвращение","невозвращенка","невозвращенчество","невозгораемость","невозделанность","невоздержание","невоздержанность","невоздержность","невозможное","невозможность","невозмутимость","невознаградимость","невольник","невольница","невольничество","неволюшка","неволя","невооружённость","невоспитанная","невоспитанность","невоспитанный","невоспламеняемость","невосполнимость","невосприимчивость","невосстановимость","невразумительность","невралгия","неврастеник","неврастеничка","неврастеничность","неврастения","невредимость","неврилемма","неврит","невроз","невролог","неврология","неврома","неврон","невропат","невропатия","невропатка","невропатолог","невропатология","невротик","неврофибриллы","невручение","невсхожесть","невыгода","невыгодность","невыдача","невыделанность","невыдержанность","невыдержка","невыезд","невыносимость","невыносливость","невыплата","невыполнение","невыполнимость","невыработанность","невыразимое","невыразимость","невыразительность","невысказанность","невыход","невыясненность","невязка","нега","негаданное","негармоничность","негатив","негативизм","неги","негибкость","негигиеничность","негласность","неглиже","негной-дерево","негодная","негодник","негодница","негодность","негодный","негодование","негодяй","негодяйка","негодяйство","негостеприимность","неготовность","негоциант","негоциантка","негоциация","негоция","негр","неграмотная","неграмотность","неграмотный","негритёнок","негритос","негритоска","негритосы","негритянка","негроид","негроиды","негры","негус","недавность","недалёкость","недальновидность","недальнозоркость","недвижимое","недвижность","недвусмысленность","недееспособная","недееспособность","недееспособный","недейственность","недействительность","неделание","неделикатность","неделимое","неделимость","неделька","недельное","неделюшка","неделя","недержание","недеятельность","недисциплинированность","недобитки","недобиток","недобор","недоброе","недоброжелатель","недоброжелательница","недоброжелательность","недоброжелательство","недоброкачественность","недобропорядочность","недобросовестность","недоброта","недоброхот","недоброхотка","недоброхотство","Недобрый","недоверие","недоверок","недовёрстка","недоверчивость","недовершённость","недовес","недовесок","недовешивание","недовоз","недовольная","недовольный","недовольство","недовыполнение","недовыпуск","недовыработка","недовыручка","недогадка","недогадливость","недогар","недогляд","недоглядка","недоговорённое","недоговорённость","недоговорка","недогрев","недогруз","недогрузка","недодача","недодел","недоделанность","недоделка","недодержка","недодуманность","недоедание","недоедки","недожатое","недожим","недожин","недожог","недозволенность","недозволительность","недозревание","недозрелость","недоимка","недоимочность","недоимщик","недоимщица","недоиспользование","недоказанность","недоказательность","недоказуемость","недокал","недокалённость","недокалка","недокармливание","недокомплект","недоконченность","недокорм","недокормка","недокос","недокурок","недолговечность","недолговременность","недолёт","недолеток","недолив","недоливание","недоливка","недолов","недоля","недомер","недомеривание","недомерок","недомогание","недомол","недомолвка","недомыслие","недонакопление","недонаселённость","недонашивание","недонесение","недоноситель","недоносительница","недоносительство","недоносок","недообложение","недооценивание","недооценка","недопаивание","недопахивание","недопёк","недописка","недописывание","недоплата","недоплачивание","недополучение","недопонимание","недопотребление","недопродажа","недопроизводство","недопуск","недопустимость","недопущение","недоработанность","недоработка","недоразвитие","недоразвитость","недоразумение","недоразуменьице","недорасход","недорисованность","недород","недоросль","недоросток","недосаливание","недосев","недосказанное","недосказанность","недосказывание","недослышка","недосмотр","недоснабжение","недосол","недоставка","недостаток","недостаточек","недостаточность","недостача","недостижимость","недостоверность","недостойность","недостоинство","недоступное","недоступность","недосуг","недосушка","недосылка","недосып","недосыпание","недосыпка","недосягаемость","недотёпа","недотка","недотрога","недотыка","недоуздок","недоуздочек","недоумение","недоуменность","недоумие","недоумок","недоучёт","недоучка","недохват","недохватка","недоходчивость","недочёт","недра","недруг","недружелюбие","недружество","недуг","недугующая","недугующий","недужая","недужий","недужная","недужность","недужный","недюжинность","неестественность","нежданность","нежелание","нежелательность","нежение","неженка","нежизненность","нежизнеспособность","нежилец","нежилица","нежилое","нежиль","нежильё","нежить","нежничание","нежности","нежность","незабвенное","незабудка","незабудочка","незавершённость","незавидность","независимость","незагрузка","незадача","незадачливость","незаинтересованность","незаконнорождённая","незаконнорождённость","незаконнорождённый","незаконность","незакономерность","незаконченность","незамедлительность","незаменимость","незаменяемость","незамерзаемость","незаметливость","незаметность","незамужница","незамужняя","незамысловатость","незанимательность","незаносчивость","незанятость","незаполненность","незапятнанность","незаселённость","незаслуженность","незатейливость","незатронутость","незаурядность","незащищённость","незваная","незваный","нездоровье","неземное","незлобивость","незлобие","незлобность","незлопамятность","незнайка","незнакомая","незнакомец","незнакомка","незнакомство","незнакомый","незнание","незнатность","незнаток","незначительность","незрелость","незримость","Незримый","незрячая","незрячий","незыблемость","неизбалованность","неизбежимость","неизбежное","неизбежность","неизбывность","неизведанное","неизведанность","неизвестная","неизвестное","неизвестность","неизвестный","неизгладимость","неизданное","нейзильбер","неизлечимость","неизменность","неизменяемость","неизмеримое","неизмеримость","неизученность","неизъяснимое","неизъяснимость","неизысканность","неизящность","нейлон","неимение","неимоверность","неимущая","неимущество","неимущий","неинициативность","неинтеллигентность","неинтенсивность","неинтересное","нейрастеник","нейрастения","нейрит","нейроз","нейролог","нейрология","нейрон","нейропат","нейропатия","нейропатолог","нейропатология","нейрохирург","нейрохирургия","неискательность","неискоренимость","неискренность","неискупимость","неискусность","неискусственность","неискусство","неискушённость","неисповедимое","неисповедимость","неисполнение","неисполнимость","неисполнительность","неиспользование","неиспорченность","неисправимость","неисправность","неиспытанное","неиспытанность","неисследованность","неиссякаемость","неистинность","неистовость","неистовство","неисторичность","неистощимость","неистребимость","неистребляемость","неисцелимость","неисчерпаемость","неисчерпанность","неисчислимость","нейтрал","нейтрализация","нейтрализм","нейтралист","нейтралитет","нейтральная","нейтральность","нейтральный","нейтрон","неказистость","неклен","неключимость","нековкость","неколебимость","некомпетентность","некомплект","некомплектность","некондиционность","неконкретность","неконституционность","некорректность","некорыстность","некось","некоторые","некрасивость","некредитоспособность","некрещёная","некрещёный","некритичность","некробиоз","некроз","некролог","некрологист","некрология","некромант","некромантия","некрополь","некрут","некрутчина","нектар","нектарий","нектарка","нектарник","нектарница","нектарность","нектароносы","некультурность","некурящая","некурящий","неладное","нелады","неласковость","нелегальность","нелегальщина","Нелёгкая","нелепица","нелепое","нелепость","неликвид","нелицеприятие","нелицеприятность","неловкость","нелогичность","нелояльность","нельма","нелюбезность","нелюбие","нелюбовь","нелюбознательность","нелюбопытство","нелюди","нелюдим","нелюдимка","нелюдимость","нелюдимство","немалое","нематериальность","немая","немезида","Немезида","немертины","неметалл","неметчина","немец","немилая","немилосердие","немилостивец","немилость","немилый","неминуемое","неминуемость","немка","немногие","немноговодность","немногое","немноголюдность","немногоречивость","немногословие","немногословность","немногосложность","немногочисленность","немогота","немогузнайка","немой","немота","немотивированность","немочка","немочь","немощная","немощность","немощный","немощь","немузыкальность","немцы","немчик","немчура","немыслимость","ненавистник","ненавистница","ненавистничество","ненавистное","ненавистность","ненависть","ненаглядная","ненаглядный","ненадёванное","ненадёжность","ненадобность","ненаказуемость","ненамеренность","ненападение","ненарушимость","ненастье","ненасытимость","ненасытность","ненатуральность","ненаучность","ненаходчивость","ненец","ненка","ненормальность","ненужное","ненужность","ненцы","необделанность","необдуманность","необеспеченность","необжитость","необитаемость","необлагаемость","необожжённость","необозримость","необоримость","необоснованность","необработанность","необразование","необразованность","необратимость","необременительность","необстрелянность","необстроганность","необтёсанность","необузданность","необходимое","необходимость","необщительность","необъективность","необъемлемость","необъяснимость","необъятное","необъятность","необыкновенное","необыкновенность","необычайность","необычность","необязательность","неогегельянец","неогегельянство","неоген","неоглядность","неограниченность","неодарвинизм","неодарвинист","неодинаковость","неоднократность","неоднородность","неодобрение","неодобрительность","неодолимость","неодушевлённость","неожиданное","неожиданность","неокантианец","неокантианство","неоклассик","неоклассицизм","неокончательность","неоконченность","неолит","неологизм","неология","неон","Неопалимая","неоперённость","неописуемость","неоплазма","неоплатность","неоправданность","неопределённость","неопределимость","неопределительность","неопровержимость","неопрятность","неопытность","неорганизованность","неорганичность","неореализм","неосведомлённость","неосвещённость","неослабность","неосмотрительность","неосмысленность","неосновательность","неосознанность","неоспоримость","неоставление","неосторожная","неосторожность","неосторожный","неосуществимость","неосязаемость","неотвратимое","неотвратимость","неотвязная","неотвязность","неотвязный","неотвязчивость","неотделанность","неотделимость","неотёса","неотёсанность","неотзывчивость","неотличимость","неотложность","неотразимость","неотрывность","неотступность","неотчётливость","неотчуждаемость","неотъемлемость","неофит","неофитка","неофициальность","неоформленность","неохота","неохотник","неохотница","неоценимость","неощутимость","неощутительность","непарнокопытные","непартийность","непереводимость","непередаваемость","непереходность","непечатное","непитательность","неплатёж","неплатёжеспособность","неплатёжность","неплательщик","неплательщица","неплодие","неплодность","неплодородность","неплодотворность","неплотность","непобедимость","неповинность","неповиновение","неповоротливость","неповторимое","неповторимость","неповторяемость","непогода","непогодица","непогодка","непогодушка","непогодь","непогрешимость","непогрешительность","неподатливость","неподача","неподведомственность","неподвижность","неподвластность","неподготовленность","неподдельность","неподкованность","неподкупность","неподражаемость","неподступность","неподсудность","неподчинение","непозволительность","непознаваемое","непознаваемость","непознанность","непокладистость","непокой","непоколебимость","непокорённая","непокорённость","непокорённый","непокоримость","непокорливость","непокорная","непокорность","непокорный","непокорство","неполадка","неполнозубые","неполноправие","неполноправность","неполнота","неполноценность","непомерность","непонимание","непонятливость","непонятное","непонятность","непопадание","непоправимость","непопулярность","непорочность","непорядок","непорядочность","непосвящённая","непосвящённость","непосвящённый","непосед","непоседа","непоседливость","непосильность","непоследовательность","непослушание","непослушная","непослушность","непослушный","непосредственное","непосредственность","непостигаемость","непостижимое","непостижимость","непостоянность","непостоянство","непотизм","непотопляемость","непотребность","непотребство","непохвальность","непохожесть","непочатость","непочтение","непочтительность","неправда","неправдивость","неправдоподобие","неправдоподобность","неправедность","неправильность","неправомерность","неправомочность","неправоспособность","неправосудие","неправота","непрактичность","непревзойдённость","непредвиденность","непреднамеренность","непредотвратимость","непредубеждённость","непредугаданность","непредумышленность","непредусмотренность","непредусмотрительность","непрезентабельность","непреклонность","непреложность","непременность","непреоборимость","непреодолимость","непререкаемость","непрерывность","непрестанность","неприбранность","неприветливость","непривлекательность","непривычка","непривычность","неприглядность","непригодность","непригожество","неприготовленность","неприемлемость","непризнание","неприкаянность","неприкосновенность","неприкрашенность","неприличие","неприличность","неприложимость","неприменимость","неприметность","непримечательность","непримиримость","непринуждённость","непринятие","неприручимость","неприспособленность","непристойность","неприступность","непритворность","непритязательность","неприхотливость","непричастность","неприютность","неприязненность","неприязнь","неприятель","неприятельница","неприятие","неприятное","неприятность","непробиваемость","непробудность","непроводимость","непродолжительность","непродуктивность","непродуманное","непродуманность","непрожитое","непрозрачность","непроизводительность","непроизвольность","непроизносимость","непроливайка","непромокаемость","непроницаемость","непроницательность","непропорциональность","непросветительность","непросвещение","непросвещённая","непросвещённость","непросвещённый","непростительность","непротивленец","непротивление","непротивленка","непротивленство","непротивленчество","непроточность","непрофессиональность","непроходимость","непрочность","Нептун","нептунизм","нептуний","нептунист","непутёвая","непутёвый","непутное","непьющая","непьющий","неработоспособность","неравенство","неравнодушие","неравнодушная","неравнодушный","неравномерность","неравноправие","неравноправность","неравносильность","нерадение","нерадивая","нерадивец","нерадивость","нерадивый","нерадостность","нерадушие","нерадушность","неразбериха","неразборчивость","неразвёрнутость","неразвитие","неразвитость","неразгаданность","неразговорчивость","неразделанность","неразделённость","неразделимость","нераздельность","неразличимость","неразложимость","неразлучник","неразлучность","неразменность","неразрешённое","неразрешённость","неразрешимость","неразрушимость","неразрывность","неразумение","неразумие","неразумная","неразумное","неразумность","неразумный","неразъяснимость","нераскаянность","нераспаханность","нерасположение","нераспорядительность","нераспространённость","нерассудительность","нерастворимость","нерасторжимость","нерасторопность","нерастраченность","нерасчёт","нерасчётливость","нерасчленимость","нерациональность","нерачение","нерачительность","нерв","нерватура","нервация","нервирование","нервишки","нервничание","нервнобольная","нервнобольной","нервное","нервность","нервоз","нервозность","нервы","нереальность","нерегулярность","нерезонность","нереида","Нереида","нереидовые","нереиды","нерентабельность","нерест","нерестилище","нерестование","нерешённость","нерешимость","нерешительность","неритмичность","нерка","неровность","неровнюшка","неровня","неродовитость","нерпа","нерпёнок","нерпуха","нерусь","нерушимость","неряха","неряшество","неряшливость","несамостоятельность","несбыточное","несбыточность","несварение","несвариваемость","несвежесть","несвершённость","несвобода","несвободность","несводимость","несвоевременность","несвойственность","несвязанность","несвязность","несгибаемость","несговорчивость","несгораемость","несдержание","несдержанность","несение","несерьёзность","несессер","несжимаемость","несимметричность","несимпатичность","нескладёха","нескладица","нескладное","нескладность","несклонная","несклонный","несклоняемость","нескончаемость","нескромность","неслаженность","несловоохотливость","несложность","неслух","неслыханное","неслышность","несмелость","несменяемость","несметность","несмеяна","несмолкаемость","несмотрение","несмываемость","несмысель","несмысленная","несмысленность","несмысленный","несмыслёнок","несмыслёночек","несмыслёныш","несмышлёнок","несмышлёность","несмышлёночек","несмышлёныш","несносность","несоблюдение","несовершеннолетие","несовершеннолетний","несовершеннолетняя","несовершенность","несовершенство","несовместимость","несовместность","несовпадение","несовременность","несогласие","несогласица","несогласованность","несоглашение","несоединимое","несоединимость","несознанность","несознательная","несознательность","несознательный","несоизмеримость","несократимость","несокрушимость","несолидность","несомненность","несомнительность","несообразительность","несообразность","несообщительность","несоответственность","несоответствие","несоразмерность","несостоятельная","несостоятельность","несостоятельный","неспелость","неспециалист","неспешность","несподручность","неспокойность","неспокойствие","неспорость","неспособность","несправедливость","неспрягаемость","несработанность","несравненная","несравненность","несравненный","несравнимость","несродность","нестандартность","нестерпимость","нестойкость","нестроевик","нестроевичка","нестроевой","нестроение","нестройность","несудимость","несудоходность","несуетливость","несуразица","несуразное","несуразность","несусветица","несусветность","несушка","несущественность","несходность","несходство","несхожесть","несценичность","несчастливец","несчастливица","несчастная","несчастненькая","несчастненький","несчастный","несчастье","несчастьице","несчётность","несъедобность","несытность","несытость","нет","нетактичность","неталантливость","нетвёрдость","нетель","нетерпёж","нетерпеливая","нетерпеливец","нетерпеливость","нетерпеливый","нетерпение","нетерпимость","нетленность","нетопырь","неторопливость","неточность","нетребовательность","нетрезвость","нетрепетность","нетронутость","не-тронь-меня","нетрудность","нетрудоспособность","нетчик","нетяг","неубедительность","неубранность","неуважение","неуважительность","неуверенность","неувядаемость","неувязка","неувязочка","неугасимость","неугода","неугомонность","неуд","неудача","неудачливость","неудачник","неудачница","неудачность","неудержимость","неудержность","неудобоваримость","неудобоисполнимость","неудобопонятность","неудобопроизносимость","неудобопроходимость","неудобочитаемость","неудобство","неудобь","неудовлетворение","неудовлетворённость","неудовлетворительность","неудовольствие","неуёмность","неуживчивость","неузнаваемость","неуклонность","неуклюжество","неуклюжесть","неукомплектованность","неукоснительность","неукротимость","неуловимость","неумелость","неумение","неумеренность","неуместность","неумёха","неумность","неумойка","неумолимость","неумолкаемость","неумытность","неумышленность","неуплата","неупорядоченность","неупотребительность","неупотребление","неуправка","неуравновешенность","неурожай","неурожайность","неурочность","неурядица","неусидчивость","неусовершенствованность","неуспеваемость","неуспевающая","неуспевающий","неуспех","неуспешность","неустанность","неустойка","неустойчивость","неустранимость","неустрашимость","неустроенность","неустройство","неуступчивость","неусыпность","неутешительность","неутешность","неутолённость","неутолимость","неутомимость","неуч","неучёная","неучёность","неучёный","неученье","неучтивость","неуютность","неуязвимость","нефелин","нефрит","нефтебаза","нефтевоз","нефтедобыча","нефтеносность","нефтепровод","нефтепродукт","нефтепромысел","нефтепромышленник","нефтепромышленность","нефтескважина","нефтесклад","нефтехранилище","нефть","нефтяник","нефтяница","нефтянка","нехватка","нехозяйственность","нехорошее","нехотение","нехристь","нецелесообразность","нецензурность","нецеремонность","нечаянность","нечеловечность","нечестивая","нечестивец","нечестивица","нечестивый","нечестие","нечестность","нечет","нечёткость","нечистоплотность","нечистота","нечистоты","Нечистый","нечисть","нечленораздельность","нечувствительность","нечуткость","нешуточность","нещадность","неэквивалентность","неэкономичность","неэкономность","неэтичность","неявка","неявственность","неяркость","неясное","неясность","неясыть","ни","нива","нивелир","нивелирование","нивелировка","нивелировщик","нивелировщица","нивка","нивх","нивхи","нивхка","нигилизм","нигилист","нигилистка","нигрозин","нигрол","нидерландец","нидерландка","нидерландцы","нижайшее","нижеследующее","нижнее","нижние","низ","низальщик","низальщица","низание","низанка","низведение","низвергатель","низвержение","низина","низинка","низиночка","низка","низкобортность","низковатость","низкое","низкопоклонник","низкопоклонница","низкопоклонничание","низкопоклонничество","низкопоклонство","низкопробность","низкорослость","низкосортность","низкость","низкоудойность","низкоурожайность","низкочастотность","низложение","низменность","низовой","низовье","низок","низость","низочек","низочка","низшие","низы","низь","никелин","никелирование","никелировка","никелировщик","никелировщица","никель","николаевка","никонианец","никонианин","никонианка","никонианство","никотин","никто","никудышник","никчемность","нилот","нилотка","нилоты","нимб","нимфа","нимфомания","нимфоманка","ниобий","ниппель","нирвана","ниспадение","нисповержение","ниспослание","ниспровергатель","ниспровергательница","ниспровержение","нистагм","нисхождение","нисшествие","нитка","ниточка","ниточник","ниточница","нитрагин","нитрат","нитрация","нитриды","нитрирование","нитрит","нитриты","нитрификация","нитробензол","нитрование","нитроглицерин","нитрокрасители","нитрокраситель","нитрокраска","нитролак","нитрофоска","нитчатка","нитчатковые","нитченка","нить","нихром","ницшеанец","ницшеанство","ничегонеделание","ничто","ничтожество","ничтожность","ничья","ниша","нищание","нищая","нищеброд","нищебродка","нищебродство","нищенка","нищенство","нищенький","нищета","нищий","но","нобили","нобилитет","нобиль","новатор","новаторство","новация","новелла","новеллетта","новеллист","новеллка","новенькая","новенький","новенькое","новизна","новик","новинка","новичок","новобранец","новобранство","новобрачная","новобрачные","новобрачный","нововведение","нововводитель","нововводительница","нововводительство","новогодие","новое","новожён","новожёны","новозеландец","новозеландка","новозеландцы","новоземелец","новокаин","новокрещен","новокрещенец","новокрещенка","новокрещённая","новокрещённый","новокупка","новолуние","новообразование","новооткрыватель","новопожалованный","новопоселенец","новопоселенка","новопреставленная","новопреставленный","новоприбывшая","новоприбывший","новоприезжая","новоприезжий","новоприехавшая","новоприехавший","новоприобретение","новопришедшая","новопришедший","новорождённая","новорождённый","новорусский","новосадка","новосёл","новоселец","новосёлка","новосёлок","новоселье","новостишка","новостройка","новость","новотёл","новшество","новь","нога","ногавка","ногавочка","ногаец","ногаи","ногайка","ногайцы","ногата","ноговица","ноготки","ноготок","ноготочек","ноготь","ногохвостки","ногтище","ногтоеда","нож","ножевище","ножеклюв","ноженька","ножечка","ножик","ножичек","ножища","ножище","ножка","ножницы","ножнички","ножны","ножовка","ножовщик","ножовщина","ножовщица","ножонка","ноздрёв","ноздреватость","ноздревина","ноздрёвщина","ноздря","нозология","нойон","нок","нокаут","нокдаун","ноктюрн","нолик","ноль","ном","нома","номад","номадизм","номады","номарх","номенклатура","номенклатурщик","номенклатурщица","номер","номеришко","номерование","номеровка","номерок","номерочек","номинал","номинализм","номиналист","номинальность","номинант","номинатив","номинация","номограмма","номография","номоканон","нона","нонет","нониус","нонпарель","нонсенс","нора","норвеженка","норвежец","норвежка","норвежцы","норд","норд-вест","норд-норд-вест","норд-норд-ост","норд-ост","норичник","норичниковые","норища","нория","норка","норма","нормализация","нормаль","нормальность","нормандец","нормандка","нормандцы","норманн","норманны","норматив","нормативизм","нормативность","нормирование","нормировка","нормировщик","нормировщица","норник","норов","норовок","норочка","норушка","нос","носарь","носач","носик","носилки","носильщик","носильщица","носитель","носительница","носишко","носище","носка","носки","носкость","носовой","носоглотка","носогрейка","носок","носорог","носочек","носочки","ностальгия","носуха","носчик","носячий","нота","нотабена","нотабене","нотабль","нотариат","нотариус","нотата","нотация","нотирование","нотис","нотификация","нотка","нотница","нотография","нотоносец","нотопечатание","нотопечатня","ноты","ноумен","ноу-хау","ночевальщик","ночевальщица","ночёвка","ночёвщик","ночёвщица","ночевье","ноченька","ночесветка","ночка","ночлег","ночлежка","ночлежник","ночлежница","ночник","ночница","ночничок","ночное","ночушка","ночь","ноша","ношение","нощь","ноябрь","нрав","нравность","нравоописание","нравоописатель","нравоучение","нравоучитель","нравоучительность","нравственность","нравы","нубиец","нубийка","нубийцы","нувориш","нуга","нуда","нудга","нудизм","нудист","нудистка","нудность","нудь","нудьга","нужда","нуждаемость","нуждица","нуждишка","нуждочка","нуждушка","нужник","нужное","нужность","нукание","нукер","нуклеин","нуклеоль","нуклон","нулик","нуллификация","нуль","нумератор","нумерация","нумерование","нумеровка","нумеровщик","нумеровщица","нумизмат","нумизматика","нуммулит","нуммулиты","нунатака","нунций","нут","нутация","нутрец","нутрия","нутро","нутромер","нутряное","нырец","нырок","ныряло","ныряльщик","ныряльщица","ныряние","нытик","нытьё","ньюфаундленд","нэп","нэпман","нэпманша","нюанс","нюансировка","нюдизм","нюдист","нюдистка","нюни","нюня","нюх","нюхалка","нюхальщик","нюхальщица","нюхание","нянечка","нянчение","нянька","нянюшка","няня","оаз","оазис","обабок","обагрение","обалдевание","обалдение","обалдуй","обандероление","обандероливание","обанкрочивание","обасурманивание","обаяние","обаятель","обаятельница","обаятельность","оббегание","оббивание","оббивка","обвал","обваливание","обвалка","обвалование","обвальщик","обваривание","обварщик","обварщица","обващивание","обвевание","обведение","обвеивание","обвёртка","обвёртки","обвёртывание","обверчивание","обвес","обвеска","обветривание","обветшалость","обветшание","обвешение","обвешивание","обвеяние","обвивание","обвивка","обвинение","обвинения","обвинитель","обвинительница","обвиняемая","обвиняемый","обвислость","обвод","обводка","обводнение","обводчик","обводчица","обвоз","обволакивание","обвораживание","обворачивание","обворовывание","обворожитель","обворожительница","обворожительность","обвязка","обвязчик","обвязчица","обвязывание","обвяление","обвяливание","обгибание","обгладывание","обглаживание","обглодок","обглодыш","обглядывание","обгнивание","обгон","обгонка","обгораживание","обгорание","обгрызание","обгрызок","обгрызывание","обдавание","обдавливание","обдаривание","обдел","обделённость","обделивание","обделка","обделывание","обдёргивание","обдернение","обдерновка","обдерновывание","обдир","обдирала","обдираловка","обдирание","обдирательство","обдирка","обдув","обдувала","обдувание","обдувка","обдумание","обдуманность","обдумывание","обдуривание","обегание","обед","обедавшая","обедавший","обедающая","обедающий","обеденка","обеденник","обедец","обеднение","обеднённость","обедник","обедница","обедня","обезболивание","обезвоживание","обезвреживание","обезглавление","обезглавливание","обездоление","обездоленная","обездоленность","обездоленный","обездоливание","обезжиривание","обеззараживание","обезземеление","обезземеливание","обезлесение","обезлесивание","обезличение","обезличивание","обезличка","обезлошадение","обезлюдение","обезнадёжение","обезнадёживание","обезножение","обезображение","обезображенность","обезображивание","обезоружение","обезоруживание","обезуглероживание","обезумевшая","обезумевший","обезьяна","обезьянка","обезьянник","обезьянничание","обезьянничество","обезьянство","обезьянщик","обеление","обеливание","обелиск","обер","оберег","оберегание","оберегатель","оберегательница","обережение","обережной","обережь","обер-кельнер","обер-кондуктор","обер-мастер","обер-офицер","обер-офицерша","обер-прокурор","обер-секретарь","обёртка","обертон","обёрточка","обёрточница","обёртчица","обёртывание","обескровление","обескровливание","обескураженность","обескураживание","обеспечение","обеспеченность","обеспечивание","обеспложивание","обеспыливание","обессахаривание","обессиление","обесславление","обесславливание","обессмысление","обессмысливание","обессоливание","обесточивание","обесцвечение","обесцвеченность","обесцвечивание","обесценение","обесценивание","обесчещение","обесчещивание","обет","обетование","обещание","обжа","обжалование","обжаривание","обжарка","обжарщик","обжарщица","обжатие","обже","обживание","обжиг","обжигала","обжигальщик","обжигальщица","обжигание","обжим","обжимание","обжимка","обжимки","обжимок","обжимщик","обжимщица","обжин","обжинка","обжинки","обжинок","обжирание","обжитие","обжитость","обжог","обжора","обжорка","обжорливость","обжорство","обзаведение","обзаведеньице","обзаведеньишко","обзавод","обзирание","обзор","обзывание","обивание","обивка","обивщик","обивщица","обида","обидчивость","обидчик","обидчица","обиженная","обиженность","обиженный","обилие","обиняк","обирала","обираловка","обирание","обиратель","обирательство","обитаемость","обиталище","обитание","обитатель","обитательница","обитель","обихаживание","обиход","Обиход","обиходливость","обиходность","обкаливание","обкалывание","обкапывание","обкармливание","обкат","обкатка","обкатчик","обкатчица","обкатывание","обкачивание","обкашивание","обкидывание","обклад","обкладка","обкладчик","обкладывание","обклеивание","обклейка","обковыривание","обколачивание","обколка","обком","обкомовец","обконопачивание","обкорм","обкос","обкосы","обкрадывание","обкраивание","обкрашивание","обкручивание","обкуривание","обкусок","обкусочек","обкусывание","облава","облавливание","облавщик","облагание","облагодетельствование","облагоображение","облагоображивание","облагораживание","облагорожение","облагороженность","облаготворение","обладание","обладатель","обладательница","облаживание","облаивание","облако","облакомер","обламывание","облапошивание","обласкивание","областник","областничество","область","облатка","облачение","облачко","облачность","облаяние","облёвывание","облегание","облегчение","облегчённость","обледенение","облежание","облёживание","облезание","облепиха","облесение","облёт","облетание","облётывание","облечение","обливальщик","обливальщица","обливанец","обливание","обливка","обливщик","обливщица","облигация","облизанность","облизывание","облик","облипание","облиственность","облитерация","облицовка","облицовщик","облицовщица","облицовывание","обличение","обличитель","обличительница","обличье","облов","облог","обложение","обложка","облом","обломов","обломовец","обломовщина","обломок","обломочек","облуживание","облупленность","облупливание","облучение","облучок","облущивание","облысение","облюбовывание","обляпывание","обмазка","обмазчик","обмазывание","обмакивание","обмалёвывание","обмалывание","обман","обманка","обманчивость","обманщик","обманщица","обманывание","обмарывание","обмасливание","обматывание","обмахивание","обмачивание","обмеблирование","обмеблировка","обмеблировывание","обмежевание","обмежёвка","обмежёвывание","обмеление","обмелина","обмельчание","обмен","обмена","обменивание","обменыш","обмер","обмерзание","обмеривание","обмерка","обмерок","обмерщик","обмерщица","обмёт","обметание","обмётка","обмётывание","обмещанивание","обмин","обминка","обмирание","обмирщение","обмол","обмолачивание","обмолвка","обмолот","обмолотки","обмолоток","обмораживание","обморачивание","обморожение","обмороз","обморок","обморочение","обмотка","обмотки","обмоточка","обмотчик","обмотчица","обмундирование","обмундировка","обмурование","обмуровка","обмуровывание","обмусливание","обмусоливание","обмыв","обмывание","обмывка","обмывки","обмыливание","обмылки","обмылок","обмякание","обнагление","обнадёжение","обнадёживание","обнажение","обнажённость","обнародование","обнаружение","обнаруживание","обнашивание","обнемечение","обнемечивание","обнесение","обнизывание","обнимание","обнищание","обнова","обновитель","обновительница","обновка","обновленец","обновление","обновлённость","обновленчество","обновляемость","обновочка","обножка","обножки","обножь","обнос","обноски","обносок","обношение","обнюхивание","обобщение","обобщённость","обобществление","обогатимость","обогатитель","обогащаемость","обогащение","обоготворение","обогрев","обогревание","обогреватель","обод","ободник","ободок","ободочек","ободранец","ободранка","ободрение","ободритель","ободрительница","ободчик","ободь","обожание","обожатель","обожательница","обожествление","обоз","обозец","обозик","обозище","обозначение","обозник","обозничество","обозный","обозреваемость","обозревание","обозреватель","обозревательница","обозрение","обозчик","обои","обой","обойдённая","обойдённый","обойка","обойма","обойщик","обол","оболванение","оболванивание","оболгание","оболонь","оболочка","оболочник","оболочники","оболтус","обольститель","обольстительница","обольстительность","обольщение","обомление","обоняние","обопрелость","оборачиваемость","оборачивание","оборванец","оборванка","оборвашка","оборвыш","оборина","оборка","оборки","обормот","обормотка","оборона","обороноспособность","оборот","оборотень","оборотистость","оборотливость","оборотность","обороть","оборочка","оборудование","оборыш","оборыши","обосабливание","обоснование","обоснованность","обособление","обособленность","обострение","обострённость","обочина","обочье","обоюдность","обрабатываемость","обрабатывание","обработанность","обработка","обработчик","обработчица","обравнивание","образ","образец","образина","образная","образник","образница","образность","образование","образованная","образованность","образованный","образователь","образовательница","образок","образочек","образумление","образумливание","образующая","образцовая","образцовость","образчик","обрамление","обрамливание","обрастание","обрастания","обрастатели","обрат","обратимость","обратное","обратные","обращаемость","обращение","обращённая","обращённый","обрез","обрезанец","обрезание","обрезка","обрезок","обрезчик","обрезчица","обрезывание","обременение","обременённость","обременительность","обретение","обречение","обречённость","обрешетина","обрешётка","обрешечение","обрешечивание","обривание","обрисовка","обрисовывание","обровнение","оброк","обротка","оброть","оброчник","оброчница","обруб","обрубание","обрубка","обрубная","обрубок","обрубочная","обрубщик","обрубщица","обругание","обруч","обручение","обрученник","обрученники","обрученница","обручье","обрушение","обрушивание","обры","обрыв","обрывание","обрыватель","обрывистость","обрывность","обрывок","обрывочек","обрывчатость","обрывчик","обрызгивание","обрызгиватель","обрытие","обрыхление","обрюзглость","обряд","обрядливость","обрядник","обрядность","обрядчик","обряжение","обсадка","обсадчик","обсаживание","обсаливание","обсасывание","обсахаривание","обсев","обсевки","обсекание","обсеменение","обсерватория","обсервация","обсечение","обсечка","обсечки","обсидиан","обскабливание","обскурант","обскурантизм","обскурантист","обскурантка","обследование","обследованность","обследователь","обслуживание","обсмаливание","обсмеивание","обсолка","обстановка","обстановочка","обстоятельность","обстоятельства","обстоятельство","обстрагивание","обстраивание","обстрачивание","обстрел","обстреливание","обстригание","обстрижка","обстройка","обструкционизм","обструкционист","обструкционистка","обструкция","обстукивание","обсуждение","обсушивание","обсушка","обсчёт","обсчитывание","обсыпание","обсыпка","обсыпь","обсыхание","обтаивание","обтапливание","обтачивание","обтачка","обтекаемость","обтекание","обтекатель","обтёска","обтёсывание","обтирание","обтирка","обтирщик","обтирщица","обтискивание","обтолковывание","обточка","обтравка","обтрясание","обтряхание","обтряхивание","обтюратор","обтюрация","обтягивание","обтяжка","обтяжчик","обтяжчица","обувание","обувка","обувщик","обувщица","обувь","обуглероживание","обугливание","обуживание","обуза","обуздание","обуздывание","обуревание","обуржуазивание","обусловленность","обутка","обух","обучение","обученность","обушок","обхаживание","обхват","обход","обходительность","обходный","обходчик","обхождение","обчёсывание","обчёт","обчистка","обшаривание","обшарпанность","обшевни","обшивальщик","обшивальщица","обшивание","обшивка","обшивщик","обшивщица","обширность","обшитие","обшлаг","обшлажок","обшлифовывание","общедоступность","общее","общежительность","общежительство","общежитие","общезначимость","общеизвестность","общенародность","общение","общеобязательность","общеполезность","общепонятность","общепризнанность","общепринятость","общераспространённость","общественник","общественница","общественность","общество","обществовед","обществоведение","общеупотребительность","общеустановленность","общечеловечность","община","общинник","общинность","общипка","общипывание","общительность","общник","общность","объегоривание","объедала","объедание","объедение","объединение","объединитель","объединительница","объедки","объедья","объезд","объездка","объездной","объездчик","объект","объектив","объективация","объективизация","объективизм","объективист","объективность","объектирование","объём","объёмистость","объёмность","объявитель","объявление","объярь","объяснение","объятие","объятия","обыватель","обывательница","обывательщина","обыгрывание","обыденность","обыдёнщина","обызвествление","обыкновение","обыкновенное","обыкновенность","обыск","обыскивание","обычай","обычность","обюрокрачивание","обязанность","обязательность","обязательство","овал","овальность","овация","овевание","Овен","овен","оверштаг","овёс","овечка","овеществление","овин","овинишко","овладение","овод","овоскоп","овощ","овощевод","овощеводка","овощеводство","овощерезка","овощехранилище","овощи","овощник","овраг","овражек","овражистость","овсец","овсинка","овсишко","овсы","овсюг","овсяник","овсяница","овсянище","овсянка","овуляция","овца","овцебык","овцевод","овцеводство","овцематка","овцесовхоз","овцеферма","овчар","овчарка","овчарник","овчарня","овчина","овчинка","овчинник","овчишка","огарок","огарочек","огарыш","огарышек","огибание","оглавление","огладывание","огласка","огласовка","оглашение","оглобля","оглодок","оглоушина","оглупение","оглупление","оглушение","оглушительность","оглядка","оглядывание","огневик","огневица","огнёвка","огнемёт","огнеопасность","огнепоклонник","огнепоклонница","огнепоклонничество","огнепоклонство","огнеприпасы","огнестойкость","огнетушитель","огнеупорность","огнеупоры","огнецвет","огниво","огнищанин","огнище","огнь","оговаривание","оговор","оговорка","оговорщик","оговорщица","оголение","оголец","оголовок","оголовье","оголтелость","огонёк","огонёчек","огонь","огораживание","огород","огородец","огородишко","огородник","огородница","огородничество","огорчение","огорчённость","огосударствление","ограбление","ограда","оградитель","оградка","ограждение","ограждённость","ограничение","ограниченность","ограничивание","ограничитель","огранка","огрёбки","огребье","огрех","огромность","огрубелость","огрубение","огрубление","огрудок","огрунтовка","огрызание","огрызок","огудина","огузок","огульность","огуменник","огурец","огуречник","огурчик","ода","одалиска","одарённость","одаривание","одевание","одёвка","одёжа","одежда","одёжка","одежонка","одеколон","одёр","одёргивание","одеревенелость","одеревенение","одержимая","одержимость","одержимый","одернение","одерновка","одеялишко","одеяло","одеяльце","одеяние","один","одинаковость","одинец","одиннадцатая","одиннадцатиклассник","одиннадцатиклассница","одиннадцатилетие","одиннадцатилетка","одиннадцатый","один-одинёшенек","одинокая","одинокий","одинокость","одиночество","одиночка","одиночник","одиозность","одиссея","одичалость","одичание","одна-одинёшенька","одно","однобокость","однобрачие","одноверец","одновременность","одноглазая","одноглазка","одноглазый","одногодка","одногодки","одногодок","одноголосие","одноголосые","однодворец","однодворка","однодворок","однодеревенец","однодерёвка","однодневка","однодомец","однодомность","однодревка","однодум","одноженец","одноземец","одноземка","однозернянка","однозначность","одноимённость","однокашник","однокашничество","одноклассник","одноклассница","одноколейка","одноколка","однокорытник","однократность","однокровная","однокровный","однокурсник","однокурсница","однолетка","однолетки","однолетник","однолеток","однолюб","однолюбец","однолюбка","однообразие","однообразность","однообщественник","одноплеменник","однополость","однополчанин","однополье","однопомётник","однопроходность","однопроходные","однопутка","однородное","однородность","однорядка","односельчанин","односельчанка","односеменодольные","односложность","односоставность","одностаничник","одностволка","односторонность","однотипность","однотонность","однофамилец","однофамилица","одноцветность","одночасье","одночлен","одобрение","одобрительность","одограф","одоление","одолжение","одомашнение","одомашнивание","одометр","одонтолог","одонтология","одонье","одонья","одописец","одр","одревеснение","одрина","одряхление","одуванчик","одул","одулы","одурачение","одурачивание","одурелость","одурение","одурманение","одурманивание","одурь","одутловатость","одутлость","одухотворение","одухотворённость","одушевление","одушевлённость","одышка","ожеледь","ожерёлок","ожерелье","ожесточение","ожесточённость","оживание","оживка","оживление","оживлённость","оживотворение","ожидалка","ожидальня","ожидание","ожидания","ожидающая","ожидающий","ожижение","ожижитель","ожина","ожинник","ожинок","ожирение","ожог","озабоченность","озадаченность","озадки","озарение","озарённость","озверелость","озверение","озвучение","озвучивание","оздоровление","озеленение","озеленитель","озерко","озеро","озероведение","озерцо","озимка","озимое","озимость","озимь","озирание","озлобление","озлобленность","ознакомление","ознакомленность","ознаменование","означение","озноб","ознобец","ознобление","озокерит","озон","озонатор","озонизация","озонирование","озорник","озорница","озорничество","озорство","ойкумена","ойрот","ойротка","ойроты","окаёмка","оказание","оказательство","оказёнивание","оказия","окаймление","окалина","окалывание","окаменелость","окаменение","окание","окантовка","оканчивание","окапывание","окарауливание","окарина","окармливание","окат","окатоличивание","окатывание","окачивание","окашивание","Окаянный","окаянство","океан","океанограф","океанография","океанолог","океанология","окисел","окисление","окислитель","окись","окиян","окказионализм","окказионалист","окклюзия","оккультизм","оккультист","оккупант","оккупация","оклад","окладка","окладчик","окладывание","оклеивание","оклейка","оклейщик","оклик","окнище","окно","око","оковалок","оковка","оковы","окоём","околачивание","околение","околёсина","околёсица","околёсная","околица","околичности","околичность","околка","околоплодник","околоток","околоточный","околоцветник","околыш","околышек","окольничество","окольничий","окольность","окольцовывание","оконечность","оконник","оконница","оконопачивание","оконце","окончание","окончательность","оконченность","оконщик","окоп","окопик","окопник","окопчик","окорка","окормка","окорок","окорщик","окостенелость","окостенение","окосье","окот","окоченелость","окоченение","окошечко","окошко","окраина","окрас","окраска","окрашенная","окрашенный","окрашивание","окрестность","окрик","окрол","окропление","окрошка","округ","округа","округление","округлённость","округлость","окружающее","окружающие","окруженец","окружение","окружность","окручивание","окрыление","окрылённость","оксидирование","оксидировка","октава","октавист","октаэдр","октет","октоих","октябрёнок","октябрины","октябрист","октябрь","окукление","окукливание","окулирование","окулировка","окулировщик","окулист","окулистка","окультуривание","окулянт","окуляр","окуляры","окуневые","окунёк","окунь","окуривание","окурок","окутывание","окучивание","окучка","окучник","оладушек","оладушка","оладья","олеандр","оледенение","олеин","оленебык","оленевод","оленеводство","оленевые","оленёнок","оленесовхоз","оленина","оленуха","олень","олеография","олеонафт","олеум","олешек","олешник","олешняк","олива","оливин","оливка","оливки","олигарх","олигархия","Олимп","олимп","олимпиада","Олимпиада","олимпиец","олифа","олицетворение","олово","оловяшка","олух","олух-олухом","ольха","ольховник","ольшаник","ольшанка","ольшняк","оляпка","ом","омар","омачивание","омеблировка","омег","омега","омежник","омела","омерзение","омерзительность","омертвелость","омертвение","омертвление","омёт","омлет","омметр","омнибус","омовение","омолаживание","омоложение","омоним","омонимика","омонимия","омороча","оморочка","омофор","омрачение","омрачённость","омуль","омут","омутина","омутище","омуток","омуточек","омшаник","омывание","омыление","он","она","онагр","онанизм","онанирование","онанист","онанистка","онаречивание","ондатра","ондулятор","онемелость","онемение","онемечение","онемечивание","онёр","оникс","онколог","онкология","онколь","ономасиология","ономастика","ономатология","онтогенез","онтогенезис","онтогения","онтология","онуча","онученька","онучка","оолиты","оология","опадание","опадение","опаздывание","опаивание","опак","опал","опала","опаливание","опалка","опалубка","опалубщик","опалывание","опальник","опара","опаривание","опарник","опарница","опасение","опаска","опасливость","опасность","опахало","опахивание","опашень","опевание","опека","опекание","опекун","опекунство","опекунша","опёнок","опера","опера-буфф","оперативка","оперативник","оперативность","оператор","операционист","операционистка","операционная","операционник","операция","опережение","оперение","оперетка","оперетта","оперирование","оперируемая","оперируемый","опечатание","опечатка","опечатывание","опивки","опиекурильня","опий","опиливание","опилка","опилки","опиловка","опиловщик","описание","описатель","описательство","описка","описывание","опись","опитие","опиум","оплавление","оплакивание","оплата","оплачивание","оплевание","оплёвывание","оплёскивание","оплетание","оплётка","оплётчик","оплётчица","оплеуха","оплеушина","оплечье","оплодотворение","опломбирование","опломбировка","опломбировывание","оплот","оплошка","оплошность","оплыв","оплывание","оплывина","оповещение","опоганивание","оподельдок","оподзоленность","оподзоливание","оподление","опоек","опоечек","опоздание","опознавание","опознаватель","опознание","опозорение","опой","опока","ополаскивание","оползание","оползень","ополоски","ополченец","ополчение","ополчённый","ополячение","ополячивание","опопанакс","опора","опоражнивание","опорки","опорожнение","опорок","опорос","опорочение","опорочивание","опосредование","опосредствование","опоссум","опостылая","опостылый","опохмелка","опочиваленка","опочивальня","опошление","опошливание","опоэтизирование","опояска","опоясок","опоясочка","опоясывание","оппозиционер","оппозиционерка","оппозиционность","оппозиция","оппонент","оппонентка","оппонирование","оппортунизм","оппортунист","оппортунистичность","оппортунистка","оправа","оправдание","оправдывание","оправка","опрастывание","опрашивание","определение","определённость","определимость","определитель","опрелость","опреснение","опреснитель","опреснок","опресноки","опрессовка","оприходование","опричина","опричник","опричники","опричнина","опробковение","опробование","опровержение","опрокидывание","опрокидыватель","опрометчивость","опрос","опростание","опросчик","опротестование","опротестовывание","опрощенец","опрощение","опрощенство","опрыскивание","опрыскиватель","опрятность","опт","оптант","оптантка","оптация","оптик","оптика","оптиметр","оптимизм","оптимист","оптимистка","оптимум","оптовик","опубликование","опунция","опус","опускание","опустелость","опустение","опустошение","опустошённость","опустошитель","опутывание","опухание","опухлость","опухоль","опушение","опушечка","опушка","опущение","опыление","опыливание","опыливатель","опылитель","опыт","опытник","опытница","опытничество","опытность","опьянелость","опьянение","опьянённость","орава","оравнодушение","оракул","орала","орало","орангутан","орангутанг","оранжад","оранжерейка","оранжерея","орание","орарь","оратай","оратель","оратор","оратория","ораторство","ораторша","орбита","оргазм","орган","органелла","органеллы","организатор","организация","организм","организованность","организовывание","органик","органист","органичность","органоген","органогены","органограф","органография","органоид","органоиды","органология","органопластика","органотерапия","органчик","органщик","оргия","орда","ордалия","орден","орденок","орденоносец","орденоноска","ордер","ординар","ординарец","ординарность","ордината","ординатор","ординаторская","ординатура","ордынец","Ореада","орёл","ореол","орех","орешек","орешенье","орешина","орешки","орешник","орешниковые","орешня","оржад","оржанище","оригинал","оригиналка","оригинальничание","оригинальное","оригинальность","оригинатор","ориентализм","ориенталист","ориенталистика","ориентация","ориентир","ориентирование","ориентированность","ориентировка","оркан","оркестр","оркестрант","оркестрантка","оркестратор","оркестрик","оркестрион","оркестрование","оркестровка","орлан","орлёнок","орлец","орлик","орлица","орляк","орлянка","орнамент","орнаментация","орнаментика","орнаментирование","орнаментировка","орнаментист","орнаментовка","орнаментщик","орнитолог","орнитология","орнитоптер","орнитофауна","ороговение","орография","орок","ороки","ороситель","ороч","орочи","орочон","орочоны","орошение","орс","орт","ортодокс","ортодоксальность","ортодоксия","ортопед","ортопедист","ортопедия","оруденение","орудие","орудование","оружейная","оружейник","оруженосец","оружие","оружиеведение","орун","орунья","орфизм","орфист","орфография","орфоэпия","орхестра","орхидея","орхидные","оршад","орясина","оса","осада","осадка","осадки","осаднение","осадок","осаждающая","осаждающий","осаждение","осаждённая","осаждённый","осаживание","осаливание","осанистость","осанка","осанна","осатанелость","осатанение","осахаривание","осваивание","осведомитель","осведомительница","осведомление","осведомлённость","освежевание","освежение","осветитель","осветление","осветлитель","освещение","освещённость","освидетельствование","освистание","освистывание","освободитель","освободительница","освобождение","освобождённость","освоение","освятитель","освящение","оседание","оседлание","оседлость","осёдлывание","осек","осекание","осёл","оселедец","оселок","осеменение","осенение","осень","осердие","осетин","осетинец","осетинка","осетинцы","осетины","осётр","осетрина","осетринка","осетроводство","осетровые","осечка","осил","осиливание","осилок","осина","осинка","осинник","осинничек","осиновик","осиплость","оскабливание","оскал","оскалец","оскаливание","осквернение","осквернитель","осколок","осколочек","оскомина","оскопление","оскорбитель","оскорбительница","оскорбительность","оскорбление","оскрёбки","оскрёбок","оскрёбывание","оскрёбыш","оскудевание","оскудение","ослабевание","ослабение","ослабитель","ослабление","оследина","ослёнок","ослепительность","ослепление","ослеплённость","ослик","ослинник","ослиха","ослица","ословодство","осложнение","ослушание","ослушивание","ослушник","ослушница","ослы","ослышка","осляк","ослятина","ослятник","осмаливание","осман","османка","османцы","османы","осматривание","осмеивание","осмётки","осмёток","осмеяние","осмий","осмогласие","осмол","осмолка","осмольщик","осмос","осмотр","осмотрение","осмотрительность","осмотрщик","осмысление","осмысленность","осмысливание","оснастка","оснастчик","оснащение","оснащённость","основа","основание","основатель","основательница","основательность","основное","основоположение","основоположник","основщик","основщица","основы","особа","особенность","особность","особняк","особнячок","особоуполномоченный","особь","осоед","осознание","осознанность","осока","осоковые","осокорник","осокорь","осолаживание","осолодение","осолонение","осолонцевание","осос","ососок","осот","осочка","оспа","оспаривание","оспенная","оспенный","оспина","оспинка","оспопрививание","оспопрививатель","оспопрививательница","оспочка","оссеин","ост","оставление","остальное","остальные","останец","останки","останов","остановка","остатки","остаток","остаточек","осташи","остготы","остеит","остекление","остеография","остеолог","остеология","остеома","остеомаляция","остеомиелит","остеосклероз","остеотомия","остепенение","остервенелость","остервенение","остережение","остерия","остзеец","остзейка","остзейцы","остинка","остистость","остит","остов","остожина","остожье","остойчивость","остолбенение","остолоп","остолопина","остолопство","осторожка","осторожность","остракизм","остранение","острастка","острацизм","острение","острец","остригание","остриё","острица","остров","островина","островитянин","островитянка","островок","острог","острога","острогубцы","острожек","острожник","острожный","острозаразная","острозаразный","острозубцы","остроконечие","остроконечник","остролист","остронос","остроносик","острослов","острословие","острота","остроугольник","остроум","остроумец","остроумие","остроумничание","остряк","острячка","остуда","остужение","остуживание","остывание","остылость","ость","остюк","остяк","остяки","остячка","осуждение","осуждённая","осуждённый","осушение","осушитель","осушка","осуществимость","осуществление","осциллограмма","осциллограф","осциллоскоп","осциллятор","осы","осыпаемость","осыпание","осыпка","осыпь","осыхание","ось","осьмерик","осьмизубые","осьмина","осьминка","осьминог","осьмуха","осьмушка","осязаемость","осязание","осязательность","отава","отакелаживание","отапливание","отара","отарщик","отбавление","отбалансирование","отбеливание","отбеливатель","отбелка","отбель","отбельщик","отбельщица","отбив","отбивание","отбивка","отбивная","отбирание","отбитие","отблеск","отбой","отбойка","отбойник","отбойщик","отбор","отборка","отборник","отборность","отбортовка","отборщик","отборщица","отбояривание","отбраковка","отбраковывание","отбрасывание","отброс","отброска","отброски","отбросок","отбросы","отбуксировка","отбуривание","отбучивание","отбывание","отбывка","отбытие","отвага","отваживание","отважность","отвал","отваливание","отвалка","отвалообразователь","отвальная","отвальный","отвальщик","отвальщица","отвар","отваривание","отварка","отведение","отведывание","отвеивание","отвергание","отвердевание","отверделость","отвердение","отверженец","отвержение","отверженник","отверженность","отверстие","отвёртка","отвёрточка","отвёртывание","отвершек","отвес","отвесное","отвесность","ответ","ответвление","ответственность","ответчик","ответчица","отвечание","отвешивание","отвивание","отвиливание","отвинчивание","отвисание","отвислость","отвлекаемость","отвлечение","отвлечённость","отвод","отводка","отводок","отводчик","отводы","отвоевание","отвоёвывание","отвоз","отвозка","отвозчик","отвозчица","отволаживание","отволакивание","отволока","отворачивание","отворот","отворотное","отврат","отвратительность","отвращение","отвыкание","отвычка","отвязка","отвязывание","отгадка","отгадчик","отгадчица","отгадывание","отгадыватель","отгиб","отгибание","отглас","отгнивание","отговаривание","отговор","отговорка","отговорщик","отговоры","отголосок","отгон","отгонка","отгонщик","отгораживание","отгородка","отгороженность","отграничение","отгребальщик","отгребание","отгрёбщик","отгрёбщица","отгрузка","отгрызание","отгул","отгуливание","отдавание","отдавливание","отдаивание","отдаление","отдалённость","отдание","отдаривание","отдарок","отдатчик","отдача","отдевание","отдел","отделанность","отделение","отделённость","отделённый","отделимость","отделитель","отделка","отделочник","отделочница","отделывание","отдельность","отдельщик","отдельщица","отдёргивание","отдирание","отдохновение","отдраивание","отдувание","отдух","отдушина","отдушник","отдушничек","отдых","отдыхающая","отдыхающий","отёк","отёл","отелло","отель","отенение","отепление","отеплитель","отёска","отёсывание","отец","отечественник","отечествие","отечество","отечествоведение","отечестволюбец","отечестволюбие","отёчность","отжатие","отживание","отжиг","отжигальщик","отжигальщица","отжигание","отжилок","отжим","отжимание","отжимка","отжимки","отжимник","отжимок","отжимщик","отжимщица","отзвук","отзвучие","отзовизм","отзовист","отзол","отзолка","отзыв","отзывчивость","отирание","отказ","отказник","отказница","отказчик","отказчица","откалывание","откапывание","откармливание","откат","откатка","откатчик","откатчица","откатывание","откачивание","откачка","откашивание","откашливание","откидка","откидывание","откладка","откладывание","отклеивание","отклейка","отклёпка","отклёпывание","отклик","отклонение","отключение","отковка","отковыривание","откол","отколка","отколупывание","откомандирование","откомандировка","откомандировывание","откопка","откорм","откормка","откормленность","откормок","откормочная","откормыш","откос","откосник","откочёвка","откочёвывание","откраивание","открахмаливание","открашивание","открепление","откровение","откровенничание","откровенность","откручивание","открывание","открыватель","открытие","открытка","открытость","открыточка","откуп","откупоривание","откупорка","откупщик","откупщица","откус","откусывание","откутывание","отлавливание","отлагательство","отладка","отламывание","отлепливание","отлёт","отлетание","отлётка","отлив","отливание","отливка","отливок","отливщик","отлитие","отличение","отличие","отличка","отличник","отличница","отличничество","отлично","отлов","отлог","отлогость","отложение","отломок","отлуп","отлучение","отлучка","отлынивание","отмаливание","отмалчивание","отмалывание","отмастка","отматывание","отмах","отмахивание","отмачивание","отмашка","отмежевание","отмежёвка","отмежёвывание","отмелость","отмель","отмена","отменность","отмерзание","отмеривание","отместка","отмета","отметание","отметина","отметинка","отметка","отметчик","отметчица","отмирание","отмобилизованность","отмол","отмолачивание","отмораживание","отморожение","отмотка","отмочка","отмститель","отмучивание","отмщение","отмывание","отмывка","отмыкание","отмычка","отнекивание","отнесение","отнимание","отнорок","относ","относительность","относка","относчик","относчица","отношение","отношения","отнятие","отображаемое","отображающий","отображение","отобразитель","отобрание","отоваривание","отогрев","отогревание","отождествление","отозвание","отоларинголог","отоларингология","отоман","отоманка","отомститель","отомщение","отонок","отопитель","отопленец","отопление","оторванность","оторвиголова","оториноларингология","оторопелость","оторопь","оторочка","оторфление","отоскоп","отоскопия","отофон","отпавшая","отпавший","отпад","отпадание","отпадение","отпаивание","отпайка","отпал","отпалка","отпальщик","отпаривание","отпарка","отпарывание","отпевание","отпетость","отпечатание","отпечатлевание","отпечатление","отпечаток","отпечатывание","отпиливание","отпилок","отпирание","отпирательство","отписка","отплата","отплеск","отплёскивание","отплетание","отплытие","отповедь","отпор","отпотевание","отпочкование","отправитель","отправительница","отправка","отправление","отпрыск","отпуск","отпускание","отпускная","отпускник","отпускница","отпускные","отпуст","отпущение","отпущенник","отпущенница","отпыловка","отработанность","отработка","отработки","отрава","отравитель","отравительница","отравление","отрада","отрадность","отражаемость","отражатель","отражение","отраслевик","отрасль","отрастание","отращивание","отребье","отрегулирование","отрез","отрезание","отрезанность","отрезвление","отрезка","отрезки","отрезок","отрезочек","отрезывание","отрёпки","отрёпыш","отрепье","отрепья","отречение","отрешение","отрешённость","отрицание","отрицатель","отрицательность","отрог","отродье","отроек","отроение","отрожек","отрок","отроковица","отросток","отросточек","отрочество","отруб","отрубание","отруби","отрубник","отрубок","отрыв","отрывание","отрывистость","отрывок","отрывочность","отрывчатость","отрыжка","отряд","отрядник","отряжение","отрясание","отряхание","отряхивание","отсадка","отсадок","отсаживание","отсасывание","отсвет","отсвечивание","отсебятина","отсев","отсевки","отсеивание","отсек","отсекание","отсёлок","отсечение","отсечка","отсечка-отражатель","отсидка","отсиживание","отскабливание","отскакивание","отскок","отскребание","отслаивание","отслоение","отслойка","отслуживание","отсмаркивание","отсоединение","отсортировка","отсос","отсрочивание","отсрочка","отставание","отставка","отстаивание","отсталая","отсталое","отсталость","отсталый","отстающая","отстающий","отстёгивание","отстёжка","отстирка","отстирывание","отстой","отстойник","отстрагивание","отстраивание","отстранение","отстрел","отстреливание","отстрельщик","отстригание","отстройка","отстукивание","отступ","отступание","отступление","отступник","отступница","отступничество","отступное","отсутствие","отсутствующая","отсутствующий","отсчёт","отсчитывание","отсылание","отсылка","отсыпание","отсыпка","отсыпь","отсыревание","отсыхание","оттаивание","отталкивание","оттаскивание","оттачивание","оттенение","оттенка","оттенок","оттень","оттепель","оттёска","оттеснение","оттёсывание","оттирание","оттирка","оттиск","оттискивание","отток","оттоман","оттоманка","оттоманы","оттопки","оттопывание","оттопыривание","отторжение","оттормаживание","отточие","отточка","оттушёвка","оттушёвывание","оттягивание","оттяжка","отуманивание","отупение","отутюживание","отучивание","отфильтровывание","отформовывание","отфрезеровывание","отфыркивание","отхаживание","отхаркивание","отхватывание","отхлёбывание","отход","отходная","отходник","отходчивость","отходы","отцвет","отцветание","отцеживание","отцеп","отцепка","отцепщик","отцепщица","отцеубийство","отцеубийца","отцовство","отцы","отчал","отчаливание","отчаяние","отчаянная","отчаянность","отчаянный","отчеканенность","отчеканивание","отчеренкование","отчёркивание","отчерпывание","отчерчивание","отчество","отчёсывание","отчёт","отчётливость","отчётность","отчизна","отчим","отчина","отчинник","отчисление","отчисления","отчистка","отчитывание","отчуждение","отчуждённость","отшвыривание","отшельник","отшельница","отшельничество","отшибание","отшивка","отшлёпывание","отшлифовка","отшлифовывание","отштамповывание","отштукатуривание","отщёлкивание","отщепенец","отщепенка","отщепенство","отщепление","отъединение","отъединённость","отъезд","отъезжающая","отъезжающий","отъезжее","отъём","отъёмка","отъёмыш","отыгрывание","отыгрыш","отыскание","отыскивание","отягощение","отягчение","отяжеление","офеня","офит","офицер","офицерик","офицеришка","офицерство","офицерша","офицерщина","офицерьё","официальность","официант","официантка","официантская","официоз","официозность","оформитель","оформительница","оформление","офорт","офортист","офранцуживание","офсайд","офсет","офтальмия","офтальмолог","офтальмология","офтальмоскоп","ох","охабень","охаживание","охаивание","охальник","охальница","охальничание","охание","охапка","охапочка","охарактеризование","охват","охватывание","охвостье","охвостья","охи","охладитель","охлаждение","охлаждённость","охлёстывание","охлократия","охлопки","охлопок","охлопье","охлопья","охмеление","охолаживание","охолащивание","охорашивание","охота","охотишка","охотка","охотник","охотница","охотничек","охотническая","охотовед","охотоведение","охра","охрана","охранение","охранитель","охранительница","охранка","охранник","охранница","охриплость","охрипь","охрянка","охуждение","охулка","оцелот","оценка","оценщик","оценщица","оцеп","оцепенелость","оцепенение","оцепление","оцет","оцинкование","оцинковка","оцинковщик","оцинковщица","оцинковывание","очаг","очажок","очанка","очарование","очарователь","очаровательница","очаровательность","очевидец","очевидица","очевидность","очеловечение","очеловечивание","очелье","оченьки","очередная","очередной","очерёдность","очередь","очерет","очерк","очеркист","очеркистка","очернение","очерствелость","очерствение","очертание","очертания","очёс","очёска","очёски","очёсы","очёсывание","очечник","очи","очин","очинка","очипок","очиститель","очистительное","очистка","очистки","очиток","очищение","очищенность","очки","очко","очкование","очковтиратель","очковтирательница","очковтирательство","ошалелость","ошаление","ошарашивание","ошаривание","ошва","ошеек","ошейник","ошеломительность","ошеломление","ошеломлённость","ошельмование","ошибка","ошибочка","ошибочность","ошиновка","ошкуй","ошлакование","ошлифовывание","ошмётки","ошмёток","ошпаривание","оштрафование","оштукатуривание","ошурки","ощипка","ощипывание","ощупывание","ощупь","ощутимость","ощутительность","ощущение","ощущеньице","па","пава","павиан","павильон","павильончик","павлин","паводок","павозка","павозок","паволока","павушка","павшая","павший","паганизм","пагинация","пагода","паголенок","пагуба","пагубность","падалец","падалина","падалица","падалище","падалка","падаль","паданец","падание","паданка","па-де-де","падеж","падёж","падекатр","падение","падепатинёр","падера","падеспань","па-де-труа","падина","падишах","падкость","падог","падожок","падрина","падуб","падуга","падун","падучая","падучка","падушка","падчерица","падшая","падший","падымок","падь","паёк","паенакопление","паж","пажитник","пажить","паз","пазанка","пазанок","пазуха","пазушка","пай","пайва","пайза","пайка","паинька","пайщик","пайщица","пак","пакгауз","пакет","пакетбот","пакетец","пакетик","паккамера","паклен","пакля","паковка","пакостник","пакостница","пакость","пакт","пал","палаван","паладин","паламедеи","паланкин","палантин","палас","палата","палатализация","палатализованный","палатальность","палатальный","палатин","палатка","палаты","палаццо","палач","палачество","палаш","паление","паленина","палёное","палеоазиат","палеоазиатка","палеоазиаты","палеоантрополог","палеоантропология","палеоботаник","палеоботаника","палеоген","палеогеограф","палеогеография","палеограф","палеографист","палеография","палеозавр","палеозой","палеозоолог","палеозоология","палеолит","палеонтолог","палеонтология","палеотерий","палестина","палестинка","палестины","палестра","палетка","палех","палец","палея","пали","палильщик","палимпсест","палингенезис","палиндром","палинодия","палинолог","палинология","палисад","палисадник","палисадничек","палисандр","палитра","палица","палишка","палия","палка","палки","палладий","палладиум","паллиатив","паллограф","палоло","паломник","паломница","паломничество","палочка","палочка-выручалочка","палочка-застукалочка","палочки","палочник","палошница","палтус","палтусина","палтух","палуб","палуба","палубление","палубник","палубные","палыгорскит","паль","пальба","пальма","пальмерстон","пальметка","пальметта","пальмира","пальмитин","пальмовые","пальмочка","пальник","пальпация","пальтецо","пальтишко","пальто","пальтушка","пальцекрылые","пальцеходящие","пальчик","пальчонок","пальщик","паля","паляница","паморок","паморока","пампа","пампасы","пампельмус","памперо","памперсы","пампуша","пампушечка","пампуши","пампушка","памфлет","памфлетёр","памфлетист","памфлетистка","памятка","памятливость","памятник","памятование","памятца","памятцо","память","пан","Пан","панагия","панама","панамка","панариций","панацея","панаш","панбархат","панголин","пандан","пандановые","панданус","пандект","пандекты","панделок","пандемия","пандус","панёва","панёвка","панёвница","панегирик","панегирист","панегиристка","панель","паненка","панёр","панзоотия","пани","панибрат","панибратство","паника","паникадило","паникёр","паникёрство","паникёрша","панировка","панихида","паница","панкреас","панкреатин","панкреатит","панна","панно","панночка","пановьё","паноптикум","панорама","панорамирование","панорамность","панорамщик","пансион","пансионат","пансионер","пансионерка","пансионишко","панство","панталонцы","панталончики","панталоны","панталошки","пантач","пантеизм","пантеист","пантеистка","пантеон","пантера","пантовар","пантовка","пантограф","пантокрин","пантометр","пантомим","пантомима","пантомимика","пантомимист","пантопон","пантуфли","пантуфля","панты","панцирник","панцирь","панщина","панье","панья","папа","папаверин","папайя","папанька","папаня","папарацци","папах","папаха","папахен","папаша","папашенька","папашка","папеж","папежество","папенька","паперть","папиллома","папильон","папильотка","папиролог","папирология","папироса","папироска","папиросник","папиросница","папиросочка","папиросочница","папирус","папка","папоротка","папоротник","папоротники","папоротниковидные","папоротниковые","папоротникообразные","папороток","папороть","папочка","папошник","паприка","папство","папуас","папуаска","папуасы","папула","папуша","папушка","папушник","папушовка","папье-маше","пар","пара","парабеллум","парабиоз","парабола","параболоид","параван","парагенезис","парагнейс","парагонит","параграф","парад","парадигм","парадигма","парадигматика","парадиз","парадизка","парадирование","парадировка","парадная","парадное","парадность","парадокс","парадоксалист","парадоксальность","паразит","паразитизм","паразитирование","паразитка","паразитолог","паразитология","паразитоценоз","паразитство","паракаучук","параклазы","параклит","парализатор","парализация","парализование","парализованность","паралитик","паралитичка","паралич","параличная","параличный","параллакс","параллелепипед","параллелизм","параллелограмм","параллель","параллельность","паралогизм","парамагнетизм","парамагнетик","парамагнетики","параметр","параметрит","парамеция","парангон","паранджа","паранефрит","параноик","параноичка","паранойя","парантез","парапет","парапитек","параподии","параподий","парапсихолог","парапсихология","парасанг","парасанга","парасоль","паратаксис","паратиф","паратость","паратуберкулёз","параф","парафин","парафинирование","парафинолечение","парафинотерапия","парафирование","парафраз","парафраза","парафразирование","парафразировка","парафразис","параша","парашечник","парашка","парашник","парашют","парашютизм","парашютик","парашютирование","парашютист","парашютистка","парвеню","пард","пардон","пардус","парез","парейазавр","паремейник","паремия","паремья","паренёк","паренёчек","парение","парёнка","пареное","паренхима","парень","пари","парии","парик","парикмахер","парикмахерская","парикмахерша","парилка","парильня","парильщик","парильщица","парина","парирование","паритель","паритет","паритетность","паричок","пария","парк","парка","Парка","паркет","паркетина","паркетчик","парки","паркинсонизм","парковка","парламент","парламентаризм","парламентарий","парламентёр","парламентёрство","пармезан","Парнас","парнас","парнасец","парная","парничок","парнишечка","парнишка","парнище","парнокопытные","парнолистник","парность","парнюга","парнюха","парня","парняга","парование","паровик","паровоз","паровозик","паровозишко","паровозник","паровозоремонтник","парогенератор","пародийность","пародирование","пародист","пародистка","пародия","пародонтоз","пароизоляция","парок","пароксизм","пароле","пароли","пароль","паром","паромер","паромщик","паромщица","парообразование","парообразователь","пароохладитель","пароочиститель","пароперегрев","пароперегреватель","паропровод","паропроизводительность","парораспределение","парораспределитель","паросборник","паротеплоход","паротит","паротурбина","пароход","пароходик","пароходишко","пароходовладелец","пароходо-фрегат","пароходство","пароходчик","парочка","парс","парсек","парсуна","парта","партбилет","партгруппа","партеногенез","партер","партиец","партизан","партизанка","партизанство","партизанщина","партийка","партийная","партийность","партийный","партикуляризм","партитура","партиция","партия","партком","партнёр","партнёрша","парторг","парторганизация","партшкола","парубень","парубок","парун","парус","парусина","парусинка","парусинник","парусник","парусность","парфорс","парфюмер","парфюмерия","парфяне","парфянин","парфянка","парх","парцелла","парцелляция","парциальность","парча","парша","паршивец","паршивик","паршивка","паршивость","пары","парюра","паря","пас","пасево","пасека","пасение","пасечник","паск","пасквиль","пасквилянт","паскуда","паскудник","паскудница","паскудство","паслён","паслёновые","пасма","пасмо","пасмурность","пасмурь","пасмы","пасовка","пасока","пасочница","паспарту","паспорт","паспортизация","паспортист","паспортистка","паспортишко","пасс","пассаж","пассажир","пассажирка","пассажиро-километр","пассажирский","пассакалия","пассакалья","пассат","пассатижи","пассеизм","пассеист","пассерование","пассеровка","пассив","пассивирование","пассивность","пассировка","пассировщик","пассия","пассы","паста","пастбище","паства","пастель","пастеризатор","пастеризация","пастернак","пастила","пастилаж","пастилка","пастильщик","пастильщица","пастор","пастораль","пасторат","пасторство","пасторша","пастриги","пастрижки","пастух","пастушество","пастушка","пастушки","пастушные","пастушок","пастушонок","пастырство","пастырь","пасть","пастьба","Пасха","пасха","Пасхалия","пасынкование","пасынок","пасьянс","пасьянсик","пасюк","пат","патагонец","патагонка","патагонцы","патан","патанка","патаны","пате","патент","патентика","патентирование","патентование","патентообладатель","патентоспособность","патер","патера","патерик","патерностер","патерство","патеси","патетизм","патетика","патетичность","патефон","патефончик","патина","патинирование","патинировка","патио","патиссон","патлы","патогенез","патогенезис","патогенность","патока","патолог","патология","патологоанатом","патопсихология","патофизиолог","паточина","патриарх","патриархализм","патриархальность","патриархальщина","патриархат","патриархия","патриаршество","патриаршествование","патрилокальность","патримоний","патриот","патриотизм","патриотик","патриотичность","патриотка","патристика","патрица","патрицианка","патрициат","патриций","патролог","патрология","патрон","патронаж","патронажество","патронат","патронатство","патронесса","патронимия","патронирование","патронишко","патронник","патронница","патронный","патронодержатель","патронохранилище","патронташ","патрончик","патронша","патронщик","патроциний","патрубок","патрулирование","патруль","патрульный","патуа","патынки","патынок","патыночек","патыночки","паужин","паужина","пауза","паузник","паузок","паузочка","паук","паукообразные","паул","паупер","пауперизация","пауперизм","паут","паутина","паутинка","паутиночка","паучиха","паучишка","паучище","паучок","пафос","пах","пахание","пахарство","пахарь","пахатник","пахви","пахвы","пахидерм","пахидермия","пахидермы","пахименингит","пахиподы","пахит","пахитоса","пахитоска","пахлава","паховик","паховина","пахолок","пахота","пахоть","пахта","пахталка","пахтальщик","пахтальщица","пахтание","пахучесть","пахучка","пацан","пацанёнок","пациент","пациентка","пацифизм","пацификация","пацифист","пацифистка","пачеси","пачечка","пачечник","пачечница","пачка","пачкание","пачкотня","пачкун","пачкунья","пачули","паша","пашалык","пашина","пашинка","пашня","паштет","пащенок","паюс","паяло","паяльник","паяльщик","паяльщица","паяние","паясничание","паясничество","паяц","пе","пеан","пебрина","певг","певень","певец","певица","певичка","певун","певунья","певучесть","певческая","певчество","певчий","пеганка","Пегас","пегаш","пегашка","пегматит","педагог","педагогика","педагогичность","педагогия","педализация","педаль","педант","педантизм","педантичность","педантка","педантство","педель","педераст","педерастия","педиатр","педиатрия","педикулёз","педикюр","педикюрша","пединститут","педогенез","педократ","педократия","педолог","педология","педометр","педофил","педофилия","педпрактика","педсовет","педучилище","педфак","пежина","пежинка","пейджер","пейджинг","пейзаж","пейзажик","пейзажист","пейзажистка","пейзан","пейзанка","пейс","пейсаховка","пейсик","пейсики","пейсы","пек","пекан","пекарня","пекарша","пекарь","пеклевание","пеклеванка","пеклеванник","пеклеванничек","пеклевань","пеклёвка","пекло","пекушечка","пекушка","пелагия","пеламида","пеларгония","пелёва","пелена","пеленание","пеленашка","пеленг","пеленгатор","пеленгация","пеленгование","пелёнка","пелёночка","пелены","пелерин","пелерина","пелеринка","пелесина","пеликан","пеликановые","пеллагра","пельвеция","пелькомпас","пельмени","пельменная","пельменчик","пельмень","пельмешек","пельмешки","пелядь","пемза","пемзовка","пемзовщик","пена","пенал","пенальти","Пенаты","пенаты","пенёк","Пенелопа","пенёчек","пение","пенис","пенициллин","пенка","пенкосниматель","пенкоснимательство","пенни","пенник","пенное","пеногон","пеночка","пенс","пенсион","пенсионер","пенсионерка","пенсия","пенсне","пентаграмма","пентаметр","пентод","пентюх","пёнышек","пень","пенье","пеньё","пенька","пеньки","пенькозавод","пенькопрядение","пеньюар","пеня","пеон","пеонаж","пепел","пепелище","пепелок","пепельница","пепиньерка","пепси","пепси-кола","пепсин","пептон","первак","перваки","первач","первачок","первая","первенец","первенство","первинка","первичное","первичность","первобытность","первогодник","первогодок","первое","первозданность","первозимица","первозимье","первоисточник","первоклассник","первоклассница","первокурсник","первокурсница","первокурсный","первоначало","первоначальник","первоначальность","первоначатие","первообраз","первообразность","первооснова","первооткрыватель","первоочерёдность","первопечатник","первопоселенец","первопоселенка","первоприсутствующий","первопричина","первопут","первопутка","первопуток","первопутье","перворазрядник","перворазрядница","первородство","первородящая","первосвященник","первоснежье","первосоние","первосортность","первотёл","первотёлка","первотельная","первоучитель","первоцвет","первоцветные","первоэлемент","первоящер","первоящеры","первые","первый","перга","пергамен","пергамент","пергидроль","переадминистрирование","переадресование","переадресовка","переадресовывание","переаранжирование","переарестовывание","переассигнование","переассигновывание","переаттестация","перебазирование","перебазировка","перебаллотировка","перебаловывание","перебалтывание","перебарщивание","перебарывание","перебег","перебегание","перебежка","перебежчик","перебежчица","перебеление","перебеливание","перебелка","перебивание","перебивка","перебивщик","перебинтовывание","перебирание","переблеск","перебой","перебор","переборанивание","переборка","переборчик","переборщик","переборщица","перебраковка","перебранка","перебрасывание","перебривание","переброс","переброска","перебрызгивание","перевал","перевалец","переваливание","перевалка","перевалочка","перевальчик","переваривание","переваримость","переварка","переварки","перевевание","переведенец","переведение","перевеивание","перевёрстка","перевёрт","перевертень","перевёртка","перевёртывание","перевес","перевеска","перевет","переветник","переветчик","перевешивание","перевеяние","перевив","перевивание","перевивка","перевинчивание","перевирание","перевисание","перевод","переводчик","переводчица","перевоз","перевозка","перевозник","перевозчик","перевозчица","переволакивание","переволок","переволока","перевооружение","перевооружённость","перевоплощаемость","перевоплощение","переворачивание","переворашивание","переворот","переворошение","перевоспитание","перевоспитывание","перевскрытие","перевыборы","перевыполнение","перевьючивание","перевязка","перевязочка","перевязочная","перевязывание","перевязь","перевяливание","перевясло","перегадывание","перегар","перегиб","перегибание","перегибщик","перегибщица","перегладывание","переглаживание","перегласовка","перегляд","переглядка","переглядывание","перегнаивание","перегнивание","перегной","переговаривание","переговорщик","переговоры","перегон","перегонка","перегораживание","перегорание","перегорода","перегородка","перегородочка","перегрев","перегревание","перегреватель","перегримировка","перегрин","перегринация","перегружатель","перегруженность","перегруз","перегрузка","перегрунтовка","перегруппировка","перегрызание","перегуд","перегудка","перегул","перегуливание","перегущение","перёд","передавание","передаватель","передавательница","передавливание","передаивание","передаривание","передаток","передаточные","передатчик","передатчица","передача","передачка","передваивание","передвигание","передвигатель","передвижение","передвижка","передвижник","передвижничество","передел","переделение","переделка","переделывание","переделыватель","переделывательница","передёргивание","передержательство","передерживание","передержка","передир","передирание","передирка","передислокация","передислоцировка","переднежаберные","передний","передник","передничек","передняя","передовая","передоверие","передовик","передовитость","передовица","передовой","передовые","передознание","передой","передойка","передок","передокладывание","передопрос","передразнивание","передраивание","передрессировка","передрессировывание","передряга","передувание","передумывание","передых","передыхание","передышечка","передышка","переедание","переезд","переездка","переём","переёмное","переёмщик","переёмщица","пережабина","пережалование","пережаривание","пережёвывание","переживание","переживания","пережиг","пережигание","пережидание","пережим","пережитое","пережиток","пережог","перезакалка","перезаклад","перезаключение","перезакрепление","перезалог","перезапись","перезаряд","перезарядка","перезаряжание","перезаряжение","перезаявка","перезванивание","перезвон","перезвяк","перезвякивание","перезимовка","перезимовывание","перезол","перезревание","перезрелка","перезрелость","перезывание","переигрывание","переизбрание","переизбыток","переиздание","переименование","переименовывание","переимка","переимчивость","переиначивание","переинструментовка","переискивание","перекал","перекалибровка","перекаливание","перекалка","перекалывание","перекантовка","перекантовывание","перекапчивание","перекапывание","перекармливание","перекат","перекатец","перекати-поле","перекатка","перекатчик","перекатчица","перекаты","перекатывание","перекачивание","перекачка","перекашивание","переквалификация","перекваска","переквашивание","перекидка","перекидывание","перекипание","перекисание","перекись","переклад","перекладина","перекладинка","перекладка","перекладные","перекладывание","переклёвывание","переклеивание","переклейка","переклеймение","переклёпка","переклик","перекликание","переклинивание","перекличка","переключаемость","переключатель","переключение","перековеркивание","перековка","перековывание","перековыривание","переколачивание","переколка","перекомиссия","перекомкивание","перекомплектование","перекомпоновка","перекомпостирование","переконопачивание","переконструирование","переконструкция","перекоп","перекопка","перекор","перекорм","перекормка","перекоры","перекос","перекочёвка","перекочёвывание","перекошенность","перекраивание","перекраска","перекрахмаливание","перекрашивание","перекрепление","перекрест","перекрёстноопылитель","перекрёсток","перекрестье","перекрещеванец","перекрещенец","перекрещение","перекрещенка","перекрещивание","перекривление","перекрикивание","перекрой","перекройка","перекрутка","перекручивание","перекрывание","перекрыватель","перекрытие","перекрышка","перекувыркивание","перекуп","перекупание","перекупка","перекупщик","перекупщица","перекупывание","перекур","перекуривание","перекурка","перекус","перекуска","перекусывание","перекутывание","перелавливание","перелагатель","переладец","перелаживание","перелаз","перелакировка","перелакировывание","переламывание","перелёжка","перелезание","перелепка","перелепливание","перелесица","перелеска","перелесок","перелесочек","перелесье","перелёт","перелетание","перелив","переливание","переливка","переливт","переливы","перелизывание","перелиновывание","перелистывание","перелицовка","перелицовывание","перелов","перелог","переложение","перелой","перелом","переломка","перелопачивание","перелуживание","перелущивание","перемагничивание","перемазанец","перемазание","перемазанство","перемазка","перемазовщина","перемазывание","перемалёвывание","перемалывание","переманивание","переманка","перемаривание","перемарка","перемарывание","перемасливание","перематывальщик","перематывальщица","перематывание","перемахивание","перемачивание","перемащивание","перемежевание","перемежёвка","перемежёвывание","перемежка","перемена","переменка","переменные","переменчивость","перемер","перемерзание","перемеривание","перемерка","перемёт","перемётка","переметчивость","переметчик","переметчица","перемётывание","перемешивание","перемещение","перемигивание","переминание","перемирие","перемножение","перемоки","перемол","перемолачивание","перемолот","перемонтирование","перемонтировка","перемораживание","перемотка","перемотчик","перемотчица","перемочка","перемощение","перемусливание","перемусоливание","перемывание","перемывка","перемыкание","перемычка","перенагревание","перенаём","переназначение","перенакопление","переналадка","перенаполнение","перенапряжение","перенаселённость","перенасыщение","перенасыщенность","перенашивание","перенесение","перенизка","перенизывание","перенимание","перенос","переносица","переноска","переносливость","переносность","переносок","переносчик","переносчица","переносье","перенумеровывание","перенюхивание","перенятие","переобмер","переобмундирование","переобмундировывание","переоборудование","переобразование","переобременение","переобременённость","переобсуждение","переобувание","переобучение","переодевание","переозвучивание","переопыление","переорганизация","переориентация","переоркестровка","переосвидетельствование","переосмысление","переосмысливание","переохлаждение","переоценка","перепад","перепадание","перепаивание","перепайка","перепалка","перепалывание","перепаривание","перепархивание","перепарывание","перепахивание","перепашка","перепев","перепевание","перепекание","перепел","перепеленание","перепелёнок","перепелёнывание","перепелица","перепёлка","перепёлочка","перепелятник","переперчивание","перепеча","перепечатание","перепечатка","перепечатывание","перепивание","перепиливание","перепилка","переписка","переписчик","переписчица","переписывание","перепись","перепихивание","переплав","переплавка","перепланирование","перепланировка","переплата","переплачивание","переплёвывание","переплеск","переплёскивание","переплёт","переплетание","переплетение","переплетённость","переплётец","переплётик","переплётная","переплётчик","переплётчица","переплывание","перепляс","переплясывание","переподготовка","перепой","переполаскивание","переползание","переполнение","переполненность","переполосица","переполох","перепона","перепонка","перепоночка","перепончатокрылое","перепончатокрылые","перепоясывание","переправа","переправка","переправление","перепрашивание","перепревание","перепрививка","переприём","перепробег","перепродавец","перепродажа","перепроектирование","перепроектировка","перепроизводство","перепрокидывание","перепруда","перепрыгивание","перепрыжка","перепрыскивание","перепрягание","перепрядение","перепряжка","перепрятывание","перепуг","перепудривание","перепуск","перепускание","перепутывание","перепутье","перерабатывание","переработка","переразвитость","перераспределение","перерастание","перерасход","перерасходование","перерасчёт","перерегистрация","перередактирование","перерез","перерезание","перерезка","перерезывание","перерешение","перерисовка","перерисовывание","перерод","перерожденец","перерождение","перерожденка","перерожденчество","переросток","переруб","перерубание","переругивание","перерыв","пересадка","пересаживание","пересаливание","пересасывание","пересахаривание","пересвист","пересвистывание","пересдача","пересев","пересеивание","пересек","пересекаемость","пересекание","переселенец","переселение","переселенка","пересечение","пересечённость","пересиживание","пересиливание","пересинивание","перескабливание","пересказ","пересказанное","пересказчик","пересказчица","пересказывание","перескакивание","перескачка","перескок","переслаивание","переслащивание","переследование","переслежина","переслежистость","переслойка","переслуживание","переслушивание","переслюнивание","пересмаливание","пересматривание","пересмеивание","пересмех","пересмешечка","пересмешка","пересмешник","пересмешница","пересмешничество","пересмотр","переснаряжение","переснастка","переснащение","переснащивание","пересоздание","пересол","пересортировка","пересоставление","пересохлость","пересочинение","переспевание","переспелость","переспоривание","переспрашивание","переспрос","перестаивание","перестанавливание","перестановка","перестановление","перестарка","перестарок","перестёгивание","перестёжка","перестилание","перестилка","перестирка","перестирывание","перестой","перестрагивание","перестраивание","перестраховка","перестраховщик","перестраховщица","перестраховывание","перестрачивание","перестреливание","перестрелка","перестриг","перестроение","перестройка","перестройщик","перестуживание","перестук","перестукивание","переступание","переступень","переступь","пересуд","пересудчик","пересудчица","пересуды","пересуживание","пересучивание","пересушивание","пересушка","пересчёт","пересчитывание","пересъёмка","пересъёмщик","пересъёмщица","пересыл","пересылание","пересылка","пересылочная","пересылочный","пересыльная","пересып","пересыпание","пересыпка","пересыпочка","пересыпщик","пересыпщица","пересыпь","пересыхание","пересыщение","перетакивание","переталкивание","перетанцовывание","перетапливание","перетаптывание","перетаскивание","перетасовка","перетасовщик","перетасовщица","перетасовывание","перетачивание","перетачка","перетекание","перетёсывание","перетир","перетирание","перетирка","перетискивание","перетлевание","переток","перетока","перетолки","перетолкование","перетолковывание","перетопка","переторжка","переточка","перетравливание","перетраивание","перетрактовка","перетрачивание","перетрёпывание","перетруска","перетрушивание","перетрясание","перетряска","перетряхивание","перетыкание","перетяга","перетягивание","перетяжка","переувлажнение","переугливание","переуживание","переузина","переузинка","переукладка","переукладывание","переулок","переулочек","переупаковка","переупаковывание","переуплотнение","переусердствование","переустройство","переуступка","переутомление","переутомлённость","переутюживание","переутюжка","переучёт","переучивание","перефасонивание","переформирование","переформировка","переформировывание","перефразирование","перефразировка","перефыркивание","перехаживание","перехаивание","перехваливание","перехварывание","перехват","перехватец","перехватка","перехватчик","перехватывание","перехихикивание","перехлёстывание","переход","переходец","переходимость","переходность","переходчивость","перехождение","перец","перецеживание","переценивание","перецепка","перецыганивание","перечаливание","перечалка","перечеканивание","перечеканка","перечень","перечёркивание","перечерпывание","перечерчивание","перечёс","перечёска","перечёсывание","перечёт","перечинивание","перечинка","перечисление","перечистка","перечитка","перечитывание","перечница","перешагивание","перешаривание","перешвыривание","перешевеливание","перешеек","перешеечек","перешелест","перешелушивание","перешёпт","перешёптывание","перешиб","перешив","перешивание","перешивка","перешивок","перешихтовка","перешлифовка","перешлихтование","перешлихтовка","перешнуровка","перешнуровывание","перешныривание","перешпиговывание","перешпиливание","перештемпелёвывание","перештопывание","перештукатуривание","перешучивание","перещёлк","перещёлкивание","перещипка","перещипывание","перещупывание","переэкзаменовка","переязок","переярка","переярок","пери","перигей","перигелий","перидотит","перикард","перикардит","перила","перилла","перильца","перильце","периметр","перина","перинка","перинушка","период","периодизация","периодика","периодичность","периост","периостит","перипатетизм","перипатетик","перипетия","периптер","перископ","перистальтика","перистиль","перистокрылки","перистокрылые","перитонит","периферия","перифраз","перифраза","перифразировка","пёрка","перкаль","перкуссия","перл","перламутр","перламутровка","перлинь","перло","перловица","перловка","перловник","перлон","перлюстрация","перманент","перманентность","пермяк","пермяки","пермячка","пернатые","пернач","перо","перочистка","перпендикуляр","перпендикулярность","перпетуум-мобиле","перрон","перс","персеверация","персеиды","перси","персик","персиковая","персифлирование","персичек","персияне","персиянин","персиянка","персона","персонаж","персонал","персонализм","персонификация","перспектива","перспективность","перспективы","перст","перстенёк","перстенёчек","перстень","персть","персы","пертурбация","перуанец","перуанка","перуанцы","Перун","перуны","перфект","перфоратор","перфораторщик","перфораторщица","перфорация","перфорирование","перхание","перхота","перхотина","перхоть","перцепция","перцеяд","перцовая","перцовка","перцовочка","перчатка","перчаточка","перчаточник","перчаточница","перчик","перш","першение","першерон","пёрышко","перье","пёс","песенка","песенник","песенница","песенность","песец","песиголовец","пёсик","пескарик","пескарь","пескарьё","пески","пескожил","песколюб","пескомёт","пескомойка","пескорой","пескоройка","пескоструйщик","песни","песнопевец","песнопение","песнословие","песнотворец","песнотворчество","песнь","песня","песок","песочек","песочник","песочница","пессимизм","пессимист","пессимистичность","пессимистка","пест","пестание","пестерь","пестик","пестициды","пестование","пестователь","пестрец","пестрина","пестринка","пестроватость","пестролистность","пёстрость","пестрота","пеструха","пеструшка","пестрядина","пестрядь","пестряк","пестрянка","пестун","пестунья","песчаник","песчанистость","песчанка","песчинка","петарда","петелька","петельщик","петельщица","петиметр","петиметрство","петит","петиция","петли","петлист","петлица","петличка","петля","петрификация","Петровки","петрограф","петрография","петролейщик","петролеум","петролий","петрология","петроль","петрушечка","петрушечник","петрушка","петуния","петунья","петух","петухи","петушишка","петушки","петушок","петя","пехлеви","пеховье","пехота","пехотинец","пехотный","пехтерь","пехтура","печалование","печаль","печальник","печальница","печальное","печатальщик","печатание","печатка","печатник","печатное","печатня","печать","печево","печенег","печенеги","печение","печёнка","печёнки","печёное","печёночка","печёночник","печёночники","печень","печенье","печеньице","печерица","печечка","печище","печка","печки-лавочки","печник","печорин","печоринство","печурка","печь","пешая","пешеход","пешеходец","пешеходство","пешец","пешечка","пеший","пешка","пешня","пещер","пещера","пещерка","пещерник","пещур","пи","пиала","пианизм","пианино","пианиссимо","пианист","пианистка","пиано","пианола","пиастр","пивко","пивная","пивник","пивница","пивнуха","пивнушка","пиво","пивовар","пивоварение","пивоварка","пивоварня","пигалица","пигмеи","пигмей","пигмейка","пигмент","пигментация","пигментирование","пигус","пиджак","пиджачишко","пиджачник","пиджачок","пиелит","пиемия","пиетет","пиетизм","пиетист","пиетистка","пижама","пижма","пижон","пижонство","пиит","пиита","пиитика","пик","пика","пикадор","пикан","пикание","пикантное","пикантность","пикап","пике","пикёр","пикет","пикетаж","пикетажист","пикетирование","пикетчик","пики","пикирование","пикировка","пикировщик","пикколо","пикник","пикничок","пикнометр","пиковка","пикон","пиктография","пикты","пикули","пикулька","пикульник","пикуля","пикша","пила","пилав","пила-рыба","пилат","пиление","пилигрим","пилигримка","пилигримство","пиликание","пилильщик","пилка","пиллерс","пиловочник","пиломатериал","пиломатериалы","пилон","пилорама","пилот","пилотаж","пилотирование","пилотка","пилоточка","пилочка","пильня","пильщик","пильщица","пилюлька","пилюля","пилястр","пилястра","пим","пима","пимки","пимокат","пимы","пинакотека","пинанга","пинание","пингвин","пингвинёнок","пинг-понг","пиндос","пинетка","пинетки","пиния","пинна","пинок","пинта","пинцет","пинцировка","пинчер","пинькание","пиодермия","пион","пионер","пионервожатая","пионервожатый","пионерка","пионерлагерь","пиоррея","пипа","пипетка","пипка","пир","пирамида","пирамидка","пирамидон","пиранометр","пират","пиратство","пиретрум","пирит","пирке","пирование","пирог","пирога","пирожище","пирожковая","пирожная","пирожник","пирожница","пирожное","пирожок","пирожочек","пирозома","пирозомы","пирок","пироксен","пироксилин","пиромания","пиромантия","пирометр","пирометрия","пироп","пироплазма","пироплазмоз","пироскаф","пироскоп","пиротехник","пиротехника","пиррихий","пирс","пирушка","пируэт","пирующая","пирующий","пиршество","писака","писание","писанина","писанка","писаное","писарёк","писарёнок","писарёчек","писариха","писаришка","писарство","писарша","писарь","писателишка","писатель","писательница","писательство","писачка","писец","писк","пискание","писклёнок","пискливость","пискля","пискотня","пискулька","пискун","пискунчик","пискунья","писсуар","пистик","пистолет","пистолет-автомат","пистолетик","пистолетишко","пистолет-пулемёт","пистоль","пистон","пистонка","писулечка","писулька","писуля","писчик","письмена","письменность","письмецо","письмишко","письмо","письмовник","письмоводец","письмоводитель","письмоводительство","письмоводительша","письмоводство","письмоносец","письмоноска","питание","питатель","питательница","питательность","питейка","питейное","питейщик","питекантроп","питок","питомец","питомица","питомка","питомник","питомничек","питон","питьё","пифагореец","пифагореизм","пифагорейство","Пифия","пифос","пифферари","пихта","пихтарник","пихтач","пихтовник","пицца","пиццерия","пиццикато","пичкание","пичуга","пичужечка","пичужка","пишущий","пища","пищалка","пищаль","пищальник","пищание","пищеварение","пищевик","пищевод","пищик","пищуха","пиявица","пиявка","пиявочка","плавание","плавень","плавильник","плавильня","плавильщик","плавильщица","плавка","плавки","плавкость","плавление","плавни","плавник","плавничок","плавность","плавня","плавсостав","плавун","плавунец","плавунчик","плавщик","плавь","плагиат","плагиатор","плагиаторство","плагиоклаз","плаз","плазма","плазмодесма","плазмодесмы","плазмодий","плакальщик","плакальщица","плакат","плакатист","плакатность","плакировальня","плакировальщик","плакировальщица","плакирование","плакировка","плакировщик","плакировщица","плакса","плаксивость","плакун","плакун-трава","плакуша","пламегаситель","пламенник","пламенность","пламень","пламя","план","планёр","планеризм","планерист","планеристка","планёрка","планеродром","планета","планетарий","планетовед","планетоведение","планида","планиметр","планиметрия","планирование","планировка","планировщик","планисфера","планка","планктон","плановик","плановость","планомерность","планочка","плантаж","плантатор","плантаторство","плантация","планчик","планшайба","планшет","планшетка","планшир","пласт","пластание","пластеин","пластида","пластик","пластика","пластикат","пластилин","пластина","пластинка","пластинник","пластиночка","пластиночник","пластинчатожаберные","пластинчатоклювые","пластинчатость","пластинчатоусые","пластицизм","пластичность","пластмасса","пластование","пластрон","пластырь","плат","плата","платан","платание","платановые","платёж","платёжеспособность","плательщик","плательщица","платина","платинат","платинирование","платинит","платинка","платиноид","платинопромышленность","платинотипия","платно","платность","плато","платок","платонизм","платоник","платочек","платформа","платье","платьевщица","платьице","платьишко","плаун","плауновые","плафон","плафончик","плаха","плахта","плац","плацдарм","плацента","плацентарные","плацкарта","плац-парад","плач","плачевность","плачея","плачущая","плачущий","плашка","плашкоут","плащ","плащаница","плащик","плащишко","плащ-палатка","плебей","плебейка","плебейство","плебисцит","плебс","плева","плевака","плевальница","плевание","плевательница","плевел","плевелы","плевок","плевра","плеврит","плевропневмония","плед","пледик","плеер","плезиозавр","плезир","плексиглас","плектр","племенник","племя","племяненка","племянник","племянница","племянничек","племяннушка","племяш","племяшок","плен","плена","пленение","пленитель","пленительность","пленица","плёнка","пленная","пленник","пленница","пленничество","пленный","плёночка","пленум","плёнчатость","пленэр","пленэрист","плеоназм","плеохроизм","плерезы","плёс","плесень","плеск","плескание","плескотня","плесневелость","плесневение","плёсо","плессиметр","плетежок","плетельщик","плетельщица","плетение","плетеница","плетёнка","плетень","плетешок","плётка","плёточка","плетушка","плеть","плетюган","плетюха","плеченогие","плечики","плечико","плечище","плечо","плешанка","плешивая","плешивец","плешивость","плешивый","плешина","плешинка","плешка","плешь","плеяда","плие","плимутрок","плинтование","плинтовка","плинтус","плинфа","плиоцен","плис","плиска","плиссе","плиссировка","плита","плитка","плитняк","плиточка","плица","плов","пловец","пловчиха","плод","плодик","плодливость","плодник","плодовитка","плодовитость","плодовод","плодоводство","плодожил","плодожорка","плодоизгнание","плодолистик","плодоножка","плодоносие","плодоносность","плодоношение","плодоовощевод","плодоовощеводство","плодоовощи","плодородие","плодородность","плодосбор","плодосмен","плодосниматель","плодосушилка","плодотворность","плодохранилище","плодуха","плодушка","плоение","плойка","плойчатость","пломба","пломбир","пломбирование","пломбировка","пломбировщик","пломбировщица","пломпуддинг","плосковатость","плоскогорье","плоскогубцы","плоскодон","плоскодонка","плоскодонник","плоскостность","плоскостопие","плоскоступие","плоскость","плоскуша","плот","плотбище","плотва","плотвица","плотвичка","плотик","плотильщик","плотина","плотинка","плотинный","плотица","плотичка","плотишко","плотник","плотницкая","плотничание","плотничек","плотничество","плотноватость","плотномер","плотность","плотовод","плотовой","плотовщик","плотогон","плотоспуск","плотоугодие","плотоугодник","плотоугодница","плотоумерщвление","плотоход","плотоядность","плотоядные","плоть","плохо","плохое","плохость","плохота","плоцка","плошечка","плошка","площадка","площадочка","площадь","площение","площильня","площильщик","площица","плуг","плугарь","плужник","плужок","плунжер","плут","плутание","плутина","плутишка","плутни","плутование","плутоватость","плутовка","плутовочка","плутовство","плутократ","плутократизм","плутократия","Плутон","плутон","плутонг","плутонизм","плутоний","плутонист","плутонос","плутяга","плывун","плывучесть","плювиограф","плювиометр","плюгавец","плюгавка","плюгавость","плюмаж","плюр","плюрализм","плюралист","плюс","плюска","плюсквамперфект","плюсконосные","плюсна","плюсование","плюсовка","плюсовщик","плюха","плюхание","плюш","плюшечка","плюшка","плюшкин","плюшкинство","плющ","плющевые","плющение","плющильня","плющильщик","пляж","пляжик","пляс","плясавец","плясавица","плясальщик","плясальщица","плясание","пляска","плясовая","плясун","плясунья","пляшущая","пляшущий","пневматик","пневматика","пневматчик","пневмограф","пневмококк","пневмония","пневмоторакс","пнекорчеватель","пнистость","пнище","побалтывание","побасёнка","побаска","побег","побегушка","побегушки","победа","победит","победитель","победительница","победоносец","победоносность","победы","побежалость","побеждённая","побеждённый","побежка","побеление","побелка","побережье","побивание","побиение","побирашка","побирушка","побитие","поблажка","побледнение","поблёклость","поблескивание","поблёскивание","побои","побоище","поборник","поборница","поборы","побранка","побратим","побратимство","побрякивание","побрякушка","побрякушки","побудитель","побудительница","побудительность","побудка","побудок","побуждение","побурение","побывальщина","побывка","повадка","повадливость","повал","повар","поварёнка","поварёнок","поварёшка","повариха","поваришка","поварня","поварская","поварчонок","поведение","повеление","повелитель","повелительница","повелительность","поверенная","поверенный","поверка","повёртывание","поверхностность","поверхность","поверье","поверяльщик","поверяющая","поверяющий","повеса","повесничание","повесничество","повествование","повествователь","повествовательница","повествовательность","повестка","повесточка","повестушка","повестца","повесть","повет","поветка","поветрие","поветь","повечерие","повешение","повешенная","повешенный","повивальник","повивание","повидло","повизгивание","повиливание","повилика","повилица","повинность","повиновение","повитель","повитуха","повитушка","повод","поводец","поводок","поводырка","поводырь","повозка","повозочка","повозочный","повой","повойник","повойничек","повойничковые","поволока","повольник","повольничек","поворачивание","поворот","поворотливость","повреждение","повременка","повремёнка","повременщик","повременщица","повседневность","повсеместность","повстанец","повстание","повстанчество","повтор","повторение","повторитель","повторнородящая","повторность","повторяемость","повытчик","повытье","повышение","повышенность","повязка","повязочка","повязывание","повязь","поганец","поганка","поганство","поганыш","погань","погасание","погашение","погиб","погибание","погибающая","погибающий","погибель","погибшая","погибший","погибь","поглощаемость","поглощение","погляд","поглядка","поглядывание","погнутость","поговорка","поговорочка","погода","погодка","погодок","погодушка","поголовщина","поголовье","погон","погона","погончик","погонщик","погонщица","погоныш","погоня","погонялка","погоняльщик","погоревшая","погоревший","погорелец","погост","пограничник","погреб","погребение","погребец","погребица","погребок","погребщик","погремок","погремушка","погрешение","погрешность","погром","погромщик","погромыхивание","погрохатывание","погружение","погрузка","погрузчик","погубитель","погубление","погудка","погулянки","под","подавальщик","подавальщица","подавание","подавление","подавленность","подавливание","подагра","подагрик","подагричка","подалирий","подалириус","подарок","подарочек","податель","подательница","податливость","податной","подать","подача","подачка","подающая","подающий","подаяние","подбавка","подбавление","подбагренник","подбадривание","подбалка","подбалочник","подбалтывание","подбегание","подбедёрок","подбел","подбеливание","подбелка","подбережник","подбережье","подберезник","подберёзовик","подбивание","подбивка","подбирание","подбитие","подблюдник","подбой","подбойка","подбойщик","подбор","подбора","подборка","подбородник","подбородок","подбородочек","подборщик","подборщица","подбрасывание","подбривание","подбрюшина","подбрюшник","подбутовка","подвал","подваливание","подвалка","подвальный","подвальчик","подваривание","подварка","подвахтенный","подващивание","подвевание","подведение","подведомственность","подвезение","подвергание","подвержение","подверженность","подверстачье","подвёрстка","подвёрстывание","подвёртка","подвёртки","подвёртывание","подвес","подвеска","подвески","подвесок","подвешивание","подвздох","подвиг","подвигание","подвид","подвижка","подвижник","подвижница","подвижничество","подвижность","подвизание","подвизгивание","подвиливание","подвинчивание","подвирание","подвишень","подвластность","подвластный","подвод","подвода","подводка","подводник","подвоз","подвозка","подвозчик","подвозчица","подвои","подвой","подвойский","подволакивание","подволока","подволочение","подворачивание","подворник","подворное","подворотничок","подворотня","подворье","подвох","подвывание","подвязка","подвязник","подвязочка","подвязывание","подвязь","подвяливание","подгаживание","подгалстучник","подгар","подгвазживание","подгиб","подгибание","подгладывание","подглаживание","подглази","подглазни","подглазница","подглазницы","подглазье","подглазья","подглядывание","подгнаивание","подгнивание","подговаривание","подговор","подговорщик","подговорщица","подголовник","подголовок","подголовье","подголосок","подголосочность","подгон","подгонка","подгонщик","подгонщица","подгоняла","подгоняльщик","подгоняльщица","подгорание","подгорье","подготавливание","подготовитель","подготовительница","подготовишка","подготовка","подготовление","подготовленность","подгребание","подгрёбки","подгрифок","подгрудок","подгруздок","подгруздь","подгрузка","подгрунтовка","подгруппа","подгрызание","подгузник","подгузничек","подгулявший","поддабривание","поддавала","поддавание","поддавки","поддавливание","поддакивание","поддалбливание","подданичество","подданная","подданный","подданство","поддатень","поддача","поддвигание","поддёв","поддевание","поддёвка","поддёвочка","поддел","подделка","подделывание","подделыватель","поддельность","поддельщик","поддельщица","поддёрг","поддергай","поддёргивание","поддержание","поддерживание","поддержка","поддир","поддирание","поддирка","поддирщик","поддой","поддолбление","поддон","поддонник","поддонок","поддразнивание","поддубень","поддубовик","поддувало","поддувальце","поддувание","поддужный","поддьяк","поделка","поделочка","подёнка","подённая","подённый","подёнщик","подёнщина","подёнщица","подёргивание","подержка","поджаривание","поджарка","поджарость","поджатие","подживание","подживление","поджигание","поджигатель","поджигательница","поджигательство","поджидание","поджилки","поджимание","поджог","поджога","подзаборник","подзаголовок","подзадоривание","подзатыльник","подзатыльничек","подзащитная","подзащитный","подзвякивание","подземелье","подземка","подзёмка","подзёмок","подземье","подзеркалье","подзеркальник","подзобок","подзол","подзолистость","подзолообразование","подзор","подзуживание","подзыв","подзывание","подий","подина","подиум","подкаливание","подкалка","подкалывание","подкаменщик","подкандальник","подкандальники","подканцелярист","подкапок","подкапчивание","подкапывание","подкарауливание","подкармливание","подкат","подкатка","подкатчик","подкатчица","подкатывание","подкачивание","подкачка","подкашивание","подкашливание","подкваска","подквашивание","подкидка","подкидной","подкидывание","подкидыш","подкисание","подкисление","подкладка","подкладывание","подкласс","подклёв","подклёвывание","подклеивание","подклейка","подклёпка","подклёпывание","подклет","подклеть","подклетье","подклик","подкликивание","подклинивание","подклинка","подклинок","подклювье","подключение","подключник","подкова","подкованность","подковка","подковонос","подковывание","подковыр","подковыривание","подковырка","подковырочка","подколачивание","подколенка","подколенки","подколупывание","подкомиссия","подкомитет","подкоморий","подконвойная","подконвойный","подкоп","подкопка","подкопщик","подкопытник","подкорачивание","подкорка","подкорм","подкормка","подкорье","подкос","подкосина","подкрад","подкрадывание","подкраивание","подкрапивник","подкрапивничек","подкраска","подкрахмаливание","подкрашенность","подкрашивание","подкрепление","подкрикивание","подкройка","подкрутка","подкручивание","подкрылок","подкрылье","подкрякивание","подкулачник","подкулачница","подкуп","подкупание","подкур","подкуривание","подкурка","подкурщик","подкуры","подлавливание","подлавочье","подлаживание","подлаз","подлаивание","подламывание","подлапник","подлатывание","подлащивание","подледник","подлежащее","подлезание","подлекарь","подлесок","подлесье","подлёт","подлетание","подлеток","подлёток","подлеточек","подлец","подлеца","подлещ","подлещик","подлив","подлива","подливание","подливка","подливочка","подлиза","подлизывание","подлинник","подлинное","подлинность","подлинь","подлипала","подлипальство","подлипание","подлисок","подлистник","подличание","подловатость","подлог","подлодка","подложка","подложность","подлокотник","подлокотня","подлом","подлость","подлыгала","подлюга","подлянка","подлячка","подмаз","подмазка","подмазочка","подмазывание","подмалёвка","подмалёвок","подманивание","подманка","подмаргивание","подмаренник","подмарывание","подмасливание","подмастер","подмастерье","подматывание","подмахивание","подмачивание","подмащивание","подмен","подмена","подменивание","подменщик","подмерзание","подмес","подмеска","подмесь","подмёт","подметала","подметальщик","подметальщица","подметание","подмётка","подмёточка","подмётчик","подмётывание","подмечание","подмешивание","подмиг","подмигивание","подмога","подмокание","подмолаживание","подмораживание","подмости","подмостка","подмостки","подмосток","подмость","подмостье","подмотка","подмочка","подмуровка","подмуровывание","подмыв","подмывание","подмывка","подмышка","подмышник","поднавес","поднавесье","поднадзорная","поднадзорность","поднадзорный","поднаречие","поднаряд","подначка","поднебесная","поднебесье","подневолье","подневольная","подневольность","подневольный","поднесение","поднизка","поднизывание","поднизь","поднимание","подновление","подноготная","подножие","подножка","поднос","подносик","подноска","подносчик","подносчица","подношение","поднятие","подобие","подобное","подобность","подобострастие","подобострастность","подобранность","подовик","подог","подогрев","подогревание","подогреватель","подогретое","пододеяльник","подозреваемая","подозреваемый","подозревание","подозрение","подозрительность","подой","подойник","подоконник","подоконница","подоконье","подол","подолье","подонки","подонок","подопечная","подопечный","подоплёка","подопревание","подорлик","подорожание","подорожная","подорожник","подорожничек","подосина","подосинник","подосиновик","подоска","подоснова","подотдел","подотряд","подотчёт","подотчётность","подошва","подпаивание","подпайка","подпал","подпалзывание","подпаливание","подпалина","подпалинка","подпарывание","подпасок","подпевала","подпевание","подпеватель","подпёк","подпечатывание","подпечек","подпечье","подпил","подпиливание","подпилка","подпилок","подпирание","подписание","подписка","подписочка","подписчик","подписчица","подписывание","подпись","подпихивание","подплетина","подплывание","подплясывание","подпол","подползание","подполица","подполковник","подполковница","подполье","подпольщик","подпольщица","подпор","подпора","подпорка","подпоручик","подпочва","подпояска","подпоясочка","подпоясывание","подправка","подпрапорщик","подпруга","подпруда","подпруживание","подпрыг","подпрыгивание","подпрягание","подпряжка","подпуск","подпускание","подпухлость","подпушек","подпушивание","подпушка","подпушь","подпятник","подпяточник","подрабатывание","подработка","подравнивание","подрагивание","подражание","подражатель","подражательница","подражательность","подражательство","подраздел","подразделение","подразумевание","подрайон","подрамник","подрамок","подранок","подрастание","подращивание","подреберье","подрегент","подрез","подрезание","подрези","подрезка","подрезчик","подрезы","подрезывание","подрезь","подрессоривание","подрессорник","подрешетина","подрешетник","подрешечение","подрешечивание","подрисовка","подрисовывание","подробность","подрост","подросток","подросточек","подруб","подрубание","подрубка","подрубщик","подрубщица","подруга","подруженька","подружка","подруливание","подрумянивание","подручная","подручник","подручница","подручный","подрыв","подрывание","подрыватель","подрывательница","подрывка","подрывник","подрывщик","подрытие","подряд","подрядец","подрядчик","подрядчица","подрядье","подрясник","подрясничек","подсад","подсадка","подсадок","подсаживание","подсак","подсаливание","подсанки","подсасывание","подсахаривание","подсачивание","подсачок","подсваха","подсвекольник","подсвет","подсветка","подсвечивание","подсвечник","подсвинок","подсвист","подсвистывание","подсев","подсевание","подсевка","подсед","подседельная","подседельник","подседельный","подседина","подсеивание","подсек","подсека","подсекание","подсекция","подсемейство","подсердечник","подсечка","подсидка","подсиживание","подсинивание","подсинька","подскабливание","подсказ","подсказка","подсказчик","подсказчица","подсказывание","подскакивание","подскобка","подскок","подскрёбыш","подслащивание","подследственная","подследственность","подследственный","подслеповатость","подслуживание","подслушивание","подслушник","подсмаливание","подсматривание","подсмеивание","подсменная","подсменный","подснежник","подсоба","подсобка","подсобник","подсобница","подсовывание","подсознание","подсознательность","подсока","подсол","подсолка","подсолнечник","подсолнух","подсолнушек","подсортировка","подсортировывание","подсос","подсосок","подсоха","подсочка","подсошка","подсошник","подспорье","подстав","подстава","подставка","подставление","подставной","подставные","подставочка","подстаканник","подстановка","подстанция","подстарок","подстёгивание","подстёжка","подстенок","подстепье","подстерегание","подстил","подстилание","подстилка","подстилочка","подстожье","подстой","подстолье","подстольник","подстораживание","подстрагивание","подстраивание","подстрачивание","подстрекание","подстрекатель","подстрекательница","подстрекательство","подстрел","подстреливание","подстрелина","подстригание","подстрижка","подстройка","подстрочник","подстругивание","подстружка","подступ","подступание","подступление","подступы","подстывание","подсудимая","подсудимость","подсудимый","подсудность","подсудок","подсумок","подсучивание","подсушивание","подсушина","подсушка","подсчёт","подсчёты","подсчитывание","подсыл","подсылание","подсылка","подсыльная","подсыльный","подсыльщик","подсыпание","подсыпка","подсыпщик","подсыхание","подтаивание","подталкивание","подталкиватель","подтанцовывание","подтапливание","подтаптывание","подтаскивание","подтасовка","подтасовщик","подтасовывание","подтачивание","подтверждение","подтёк","подтекание","подтекст","подтекстовка","подтёлок","подтёска","подтёсывание","подтип","подтирание","подтирка","подтоварник","подток","подтоп","подтопка","подтопление","подтопок","подторжье","подтормаживание","подточка","подтравка","подтравливание","подтрунивание","подтрушивание","подтушёвка","подтушёвывание","подтыкание","подтягивание","подтяжка","подтяжки","подтянутость","подусник","подусники","подуст","подуститель","подуськивание","подучивание","подушечка","подушечки","подушка","подушная","подушное","подущение","подфарник","подфарок","подхалим","подхалимаж","подхалимка","подхалимство","подхалюза","подхват","подхватывание","подхвостник","подхвостье","подхихикивание","подхлёстывание","подход","подходец","подходка","подходчик","подхомутник","подхорунжий","подхрапывание","подцвет","подцветка","подцвечивание","подцед","подчасок","подчеканка","подчёркивание","подчёркнутое","подчёркнутость","подчинение","подчинённая","подчинённость","подчинённый","подчистка","подчитка","подчитчик","подчитывание","подчищение","подшеек","подшёптывание","подшёрсток","подшесток","подшефная","подшефный","подшибание","подшивальщик","подшивание","подшивка","подшипник","подшкипер","подшлемник","подшлифовка","подшпиливание","подшпоривание","подштанники","подштурман","подшучивание","подщёлкивание","подъедание","подъезд","подъездок","подъезжание","подъельник","подъём","подъёмка","подъёмник","подъёмные","подъёмщик","подъёмщица","подъесаул","подъязик","подъязок","подыгрывание","подызбица","подымание","подыскание","подыскивание","подытоживание","подьячество","подьячий","поедание","поедатель","поедательница","поединок","поединщик","поедь","поезд","поездка","поездование","поездуха","поезжанин","поезжанка","поение","пожалование","пожар","пожарище","пожарная","пожарник","пожарница","пожарный","пожатие","пожёвывание","пожелание","пожелтение","пожертвование","пожива","поживишка","поживка","пожизненность","пожилая","пожилой","пожимание","пожирание","пожиратель","пожирательница","пожитки","пожниво","пожня","пожог","поза","позаимствование","позванивание","позволение","позволительность","позвонок","позвоночек","позвоночник","позвоночные","позвякивание","поздника","позднота","поздныш","поздравитель","поздравительница","поздравление","позёвывание","позеленение","позём","поземельное","позёмина","позёмка","позёмная","позёмок","позёр","позёрка","позёрство","позирование","позировка","позитив","позитивизм","позитивист","позитивистка","позитивное","позитивность","позитрон","позитура","позиции","позиционность","позиция","позлащение","познабливание","познаваемость","познавание","познание","познания","позолота","позолотчик","позор","позорище","позумент","позументик","позументщик","позыв","позывистость","позывные","позык","пойка","поилец","поилица","поилка","пойло","пойма","поимка","поимщик","пойнтер","поиск","поиски","поисковик","показ","показание","показания","показатели","показатель","показательность","показывание","покалывание","покат","покатость","покатывание","покачивание","покашливание","покаяние","покер","покладистость","поклажа","поклёв","поклёвка","поклёп","поклёпщик","поклёпщица","поклон","поклонение","поклонник","поклонница","поклонничество","поковка","покоец","покои","покой","покойная","покойник","покойница","покойницкая","покойничек","покойный","поколение","покорение","покоритель","покорительница","покорность","покоробленность","покорство","покос","покосник","покосчик","покража","покраска","покраснение","покрик","покрикивание","покров","Покров","покровитель","покровительница","покровительство","покрой","покромка","покручивание","покрывало","покрывальце","покрывание","покрытие","покрытосеменные","покрытосемянные","покрышка","покрякивание","покряхтывание","покупатель","покупательница","покупка","покупочка","покупщик","покупщица","покус","покушение","пол","пола","поламывание","полати","полба","полдень","полденьги","полдник","полдничание","полдороги","поле","полевение","полевик","полевица","полевичка","полёвка","полевод","полеводка","полеводство","полевые","полегаемость","полегание","полёглость","полежалое","полезное","полезность","полемарх","полемизатор","полемика","полемист","полемистка","полемичность","полендвица","поленика","поленица","поленище","поленница","полено","поленце","полесник","полесье","полёт","полечка","полешко","полжизни","ползание","ползок","ползун","ползунки","ползунок","ползунья","ползучесть","полиандрия","полиартрит","полив","полива","поливальщик","поливальщица","поливание","поливка","полигамия","полигенизм","полигиния","полиглот","полигон","полиграф","полиграфист","полиграфия","поликлиника","полимент","полимер","полимеризация","полимерия","полимеры","полиметрия","полиморфизм","полиневрит","полинезиец","полинезийка","полинезийцы","полином","полиомиелит","полип","полипоид","полиритмия","полировальник","полирование","полировка","полировщик","полировщица","полис","полисемия","полисмен","полиспаст","политеизм","политеист","политес","политик","политика","политикан","политиканка","политиканство","политиканша","политипаж","политипажня","политическая","политический","политичность","политкаторжанин","политкаторжанка","политональность","политрук","политура","полифонист","полифония","полихромия","полицай","полицеймейстер","полицеймейстерство","полицеймейстерша","полицейский","полиция","поличное","полишинель","полиэтилен","полк","полка","полковник","полковница","полковничиха","полководец","полковой","поллитровка","поллюция","полновесность","полновластие","полноводность","полноводье","полногласие","полнозвучность","полнокровие","полнокровность","полнолуние","полномочие","полномочия","полноправие","полноправность","полносочность","полнота","полноценность","полночи","полночь","полнощь","поло","пол-оборота","полова","половец","половик","половина","половинка","половинник","половинчатость","половинщик","половинщица","половица","половичок","половник","половничество","половодь","половодье","половозрелость","половой","половцы","половчанка","половщик","полог","пологость","положение","положенное","положеньице","положительное","положительность","полоз","полозок","полой","полок","полольник","полольщик","полольщица","полом","поломка","поломойка","полон","полонез","полонизация","полонизм","полоний","полоняник","полоняничек","полонянка","полоняночка","полорогие","полоса","полосатость","полоска","полоскание","полоскательница","полоскательное","полоскун","полосование","полосонька","полосочка","полость","полосушка","полосчатость","полотенце","полотёр","полотнище","полотно","полоток","полоть","полоумие","полоумная","полоумный","полочка","полпред","полпредство","полпути","полстолька","полстолько","полсть","полтина","полтинка","полтинник","полтинничек","полуавтомат","полубак","полубарка","полубаркас","полубархат","полубог","полубогиня","полубокс","полубольная","полубольной","полуботинки","полуботинок","полубред","полубутылка","полувал","полугар","полугласный","полугодие","полугодок","полугора","полуда","полудикарь","полудрёма","полудремота","полудужие","полуживая","полуживой","полузабытое","полузабытьё","полузащита","полузащитник","полузнайка","полузнайство","полуимпериал","полуимя","полукафтан","полукафтанье","полукожник","полуколония","полукольцо","полукочевник","полукровка","полукровок","полукруг","полукружие","полукустарник","полулист","полумаска","полумгла","полумера","полумесяц","полумрак","полумысль","полунамёк","полуночник","полуночница","полунощник","полунощница","полуобезьяна","полуобезьяны","полуоборот","полуокружность","полуостров","полуось","полупальто","полупар","полуподвал","полупоклон","полуполковник","полупортик","полупризнание","полуприседание","полуприцеп","полупроводник","полупустыня","полусвет","полусмерть","полусон","полусредний","полустанок","полустишие","полусумрак","полусфера","полутемнота","полутень","полутон","полутона","полуторатонка","полуторка","полутруп","полутьма","полуулыбка","полуустав","полуфабрикат","полуфинал","полуфраза","полуфрак","полухронометр","получас","получатель","получательница","получеловек","получение","получка","полушаг","полушалок","полушалочек","полушар","полушарие","полушёпот","полушечка","полушка","полушубок","полушубочек","полуэкипаж","полуэскадрон","полуэтаж","полуют","полуявь","полцарства","полцены","полчанин","полчаса","полчасика","полчище","полчок","полшага","полымя","полынка","полынная","полыновка","полынь","полынья","полыхание","польза","пользование","пользователь","полька","польский","полюбовник","полюбовница","полюбовность","полюдье","полюс","полюсник","полюшко","поля","поляк","поляки","поляна","поляне","полянка","поляночка","полянушка","поляризатор","поляризация","поляриметр","полярископ","полярник","полярница","полярность","поляроид","полячка","поляш","помавание","помада","помадка","помазание","помазанник","помазанница","помазок","помазывание","помаргивание","помарка","поматывание","помахивание","помело","померанец","померанцевые","помертвение","поместительность","поместье","поместьице","помесь","помёт","помета","пометка","пометочка","помеха","помехи","помешанная","помешанный","помешательство","помешивание","помешка","помещение","помещеньице","помещик","помещица","помещичек","помигивание","помидор","помидорина","помидорка","помидорчик","помилование","помилованная","помилованный","помин","поминальная","поминальник","поминальница","поминальщик","поминальщица","поминание","поминка","поминки","поминовение","поминок","поминщик","поминщица","помины","помога","помогание","помои","помойка","помол","помолвка","помолвленная","помолвленный","помолец","помолка","помольщик","помор","поморец","поморка","поморник","поморы","поморье","поморяне","поморянин","поморянка","помост","помостик","помочи","помощник","помощница","помощничек","помощь","помпа","помпадур","помпадурство","помпадурша","помпезность","помпон","помпончик","помрачение","помутнение","помыкание","помыкательство","помысел","помычка","помышление","помятость","понапраслина","понёва","понедельник","пони","понижение","понизовье","пониклость","понимание","пониток","поножи","поножовщик","поножовщина","пономариха","пономарица","пономарство","пономарь","поноровка","понос","поноситель","поношение","поношенность","понтёр","понтирование","понтировка","понтифик","понтификат","понтон","понтонёр","понуждение","понукальщик","понукание","понукатель","понукательство","понурость","пончик","пончо","понюх","понюшечка","понюшка","понятие","понятия","понятливость","понятное","понятность","понятой","понятьице","поощрение","поощритель","поп","попа","попадание","попадья","поп-арт","попас","попевка","попённые","попёнок","поперечина","поперечная","поперечник","поперечный","попечение","попечитель","попечительница","попечительность","попечительство","попечительша","попик","попиливание","попирание","попиратель","попирательница","попискивание","поп-искусство","пописывание","попишка","попка","поплавок","поплёвывание","поплин","поплясывание","поп-музыка","поповец","попович","поповка","поповна","поповник","поповство","поповщина","попойка","поползень","поползновение","пополнение","попона","попонка","поправа","поправка","поправление","поправочка","попрание","попрёк","поприще","попрошайка","попрошайник","попрошайничество","попрошайство","попрыгивание","попрыгун","попрыгунья","попрыгушка","попрыск","попрыскивание","попса","попугай","попугайничество","попугайство","попугайчик","популяризатор","популяризация","популяризирование","популярничание","популярность","попурри","попуститель","попустительница","попустительство","попутный","попутчик","попутчики","попутчица","попутье","попущение","попытка","попыхи","попыхивание","пора","поработитель","порабощение","поравнение","поражаемость","пораженец","поражение","пораженчество","поразительность","поредение","порез","порезка","порезник","порей","поречная","поречье","пористость","порицание","порицатель","порка","порнограф","порнография","порог","порода","породистость","породность","порождение","порожек","порожистость","порожняк","порок","поролон","поронцы","поросёнок","поросль","порося","поросятина","поросятинка","поросятник","порох","пороховница","порочение","порочность","пороша","порошина","порошинка","порошница","порошок","порошочек","порт","портал","портативность","портач","портвейн","портвейнец","портер","портерная","портик","портище","портки","портмоне","портмонет","портниха","портной","портняга","портняжение","портняжество","портняжка","портняжничество","порто","портовик","портовый","портомойка","портомойня","портомоя","порто-франко","порточки","портпапирос","портплед","портрет","портретец","портретик","портретирование","портретист","портретистка","портретная","портсигар","портсигарчик","порттабак","португалец","португалка","португальцы","портулак","портулаковые","портупей-прапорщик","портупей-юнкер","портупея","портфелик","портфелишко","портфель","портфельчик","портчишки","портшез","порты","портье","портьера","портьерка","портянка","портяночка","поруб","порубка","порубщик","порубь","поругание","порука","поруха","поручатель","поручательница","поручательство","поручейник","порученец","поручение","порученность","поручень","порученьице","поручи","поручик","поручитель","поручительница","поручительство","поручица","поручни","поручник","поручница","порфир","порфира","порфирит","порфироносец","порхание","порхунья","порцион","порционные","порционы","порция","порча","порченая","порченый","поршень","поршни","поры","порыв","порывистость","порывчивость","порядки","порядовка","порядок","порядочность","посад","посадка","посадник","посадница","посадничество","посадничиха","посадский","посапывание","посверкивание","посветление","посвист","посвистывание","посвящение","посвящённая","посвящённый","посев","посевная","посевщик","поседки","поселенец","поселение","поселенка","поселковая","поселковый","посёлок","поселянин","поселянка","посестримство","посетитель","посетительница","посетительская","посещаемость","посещение","посиделки","посиденки","посидки","поскабливание","поскок","посконина","посконь","поскотина","поскрёбки","поскрёбыш","поскрипывание","послабление","посланец","послание","посланная","посланник","посланница","посланный","послед","последействие","последки","последнее","последование","последователь","последовательница","последовательность","последствие","последующее","последыш","послелог","послесловие","пословица","послуга","послух","послушание","послушливость","послушник","послушница","послушничество","послушность","посмех","посмешище","посмеяние","пособие","пособник","пособница","пособничество","посол","посольство","посох","посошок","поспевание","поспешение","поспешность","посрамление","посредник","посредница","посредничество","посредственно","посредственность","посредство","пост","постав","поставец","поставка","поставление","поставщик","поставщица","постамент","постановка","постановление","постановщик","постарение","постель","постелька","постельник","постельница","постельничий","постепенность","постигание","постижение","постилка","постилочка","постирушка","постник","постница","постничество","постное","постовой","постой","постороннее","посторонний","посторонняя","постоялец","постоялица","постоялка","постоялое","постоянность","постоянство","постпозиция","пострадавшая","пострадавший","пострел","пострелёнок","постреливание","постриг","постриженец","пострижение","постриженик","постриженица","постриженка","построение","построечка","постройка","построитель","постройщик","постромка","постскриптум","постукивание","постулат","поступание","поступательность","поступление","поступок","поступочек","поступь","постыдность","постылая","постылость","постылый","посуда","посудина","посудинка","посул","посыл","посылка","посылочка","посыльная","посыльный","посыльщик","посыпание","посыпка","посюсторонность","посягание","посягатель","посягательница","посягательство","посягновение","пот","потаённость","потакальщик","потакальщица","потакание","потакатель","потакательница","поталь","потаскун","потаскунья","потаскуха","потаскуша","потаскушка","потасовка","потассий","потатуйка","потатчик","потатчица","потачка","потачливость","поташ","поташник","потворство","потворствование","потворщик","потворщица","потёк","потёмки","потемнение","потёмочки","потение","потентат","потенциал","потенцирование","потенция","потепление","потери","потерна","потерпевшая","потерпевший","потёртость","потеря","потерянная","потерянность","потерянный","потесь","потеха","потешка","потешник","потешница","потешные","потешный","потир","потирание","потливость","потник","потница","потогонное","поток","потолок","потолочина","потомки","потомок","потомство","потонувшая","потонувший","потоотделение","потоп","потопление","поторапливание","поточность","потрава","потравщик","потрата","потрафление","потреба","потребитель","потребление","потребность","потрескивание","потроха","потрошение","потрясение","потряхивание","потуга","потуги","потупленность","потускнение","потусторонность","потухание","потчевание","потылица","потьма","потяг","потягивание","потягота","потяжка","поучение","поучительность","поучительство","пофыркивание","похабник","похабница","похабность","похабство","похабщина","похвала","похваливание","похвальба","похвальбишка","похититель","похитительница","похищение","похищенное","похлёбка","похлёбочка","похлипывание","похмелка","похмелье","поход","походка","походочка","похождение","похождения","похожесть","похолодание","похоронка","похоронная","похороны","похотливость","похоть","похранение","похрапывание","похрустывание","похрюкивание","похудание","похудение","похула","поцелуй","поцелуйчик","почавкивание","почасовик","початок","початочек","почва","почвенник","почвенничество","почвенность","почвовед","почвоведение","почерк","почернение","почести","почесть","почесуха","почёсывание","почёт","почётность","почечка","почечник","почечуй","почивальня","почивание","почившая","почивший","почин","починка","починочка","починщик","починщица","почитание","почитатель","почитательница","почка","почки","почкование","почкосложение","почта","почтальон","почтальонша","почтамт","почтарка","почтарь","почтдиректор","почтение","почтенная","почтеннейшая","почтеннейший","почтенность","почтенный","почтительность","почтмейстер","почтмейстерша","почтовик","почтовые","почтовый","пошаркивание","пошатывание","пошевеливание","пошепт","пошехонец","пошиб","пошив","пошивочник","пошивочница","пошивщик","пошивщица","пошлец","пошлина","пошлинник","пошловатость","пошлое","пошлость","пошляк","пошлятина","пошлячка","пощада","пощелкивание","пощение","пощёчина","пощипывание","поэзия","поэма","поэмка","поэт","поэтесса","поэтизация","поэтизирование","поэтик","поэтика","поэтичность","поющий","появление","поярок","пояс","поясина","пояснение","поясница","поясок","прабабка","прабабушка","права","правая","правда","правда-матка","правда-матушка","правденка","правдивость","правдоискатель","правдоискательство","правдолюб","правдолюбец","правдолюбие","правдоносец","правдоподобие","правдоподобность","праведная","праведник","праведница","праведность","праведный","правила","правилка","правило","правильность","правильщик","правильщица","правитель","правительница","правительство","правка","правленец","правление","правнук","правнука","правнуки","правнучата","правнучек","правнучка","право","правобережье","правовед","правоведение","правоведец","правоверие","правоверность","праводушие","правозаступник","правозаступничество","праволюб","праволюбие","правомерность","правомочие","правомочность","правонарушение","правонарушитель","правонарушительница","правоотношение","правописание","правопорядок","правопреемник","правопреемство","православие","православная","православные","православный","правосознание","правоспособность","правосудие","правота","правофланговая","правофланговый","правша","правые","правый","прагматизм","прагматик","прагматика","прагматист","прагматичность","прадед","прадедушка","прадеды","празднество","праздник","праздничание","праздничек","праздничность","празднование","празднолюбец","празднолюбие","праздномыслие","празднослов","празднословие","праздность","праздношатай","праздношатайка","праздношатание","праздношататель","праздношатательство","праздношатающаяся","праздношатающийся","празелень","празем","празеодим","праистория","пракрит","практик","практика","практикант","практикантка","практикум","практицизм","практичность","пралине","праматерь","праотец","праотцы","прапор","прапорщик","прапорщица","прапрабабка","прапрабабушка","праправнук","праправнуки","праправнучка","праправнучки","прапрадед","прапрадедушка","прапрадеды","прапращур","прародина","прародители","прародитель","прародительница","прасол","прасолка","прасольство","прасольщица","пратикабль","прах","прачечная","прачка","пращ","праща","пращник","пращур","праязык","преамбула","пребывание","превалирование","превенция","превозвышение","превозмогание","превознесение","превозношение","превосходительство","превосходство","превратное","превратности","превратность","превращаемость","превращение","превыспренности","превыспренность","превышение","преграда","преграждение","прегрешение","предамбарье","предание","преданность","предатель","предательница","предательство","предбанник","предбанничек","предварение","предварилка","предварительность","предведение","предвестие","предвестник","предвестница","предвечерие","предвещание","предвещатель","предвещательница","предвзятость","предвидение","предвкусие","предвкушение","предводитель","предводительница","предводительство","предвозвеститель","предвозвестительница","предвозвестник","предвозвестница","предвозвещение","предвосхищение","предвычисление","предгорье","предгрозовье","предгрозье","преддверие","предел","пределы","предельность","предзимье","предзнаменование","предзорье","предика","предикат","предикативность","предикация","предилекция","предисловие","предкамера","предки","предлежание","предлог","предложение","предложный","предместник","предместница","предместье","предмет","предметник","предметница","предметность","предметы","предмостье","предназначение","преднамерение","преднамеренность","предначертание","предначинание","предок","предоперационная","предопределение","предопределённость","предоставление","предостережение","предосторожность","предосудительное","предосудительность","предотвращение","предохранение","предохранитель","предощущение","предписание","предплечье","предплужник","предплюсна","предположение","предположительность","предполье","предпосылка","предпочка","предпочтение","предпочтительность","предприимчивость","предприниматель","предпринимательница","предпринимательство","предприятие","предпрядение","предрасположение","предрасположенность","предрассудки","предрассудок","предрассуждение","предрекание","предречение","предрешение","предрешённость","предросток","председатель","председательница","председательство","председательствование","председательствующий","председательша","предсердие","предсказание","предсказатель","предсказательница","предсказывание","представитель","представительница","представительность","представительство","представка","представление","предстатель","предстательница","предстательство","предстепье","предстояние","предстоящее","предстоящий","предтеча","предубеждение","предуведомление","предугаданное","предугадывание","предуготовление","предударный","предуказание","предумышление","предумышленность","предупредительность","предупреждение","предусматривание","предусмотрение","предусмотрительность","предустье","предутро","предчувствие","предшественник","предшественница","предшествование","предъявитель","предъявительница","предъявление","предыдущее","предыстория","преемник","преемница","преемничество","преемственность","преемство","преждевременность","прежнее","презент","презентабельность","презентант","презентация","презерватив","презервация","презервы","президент","президентство","президентура","президентша","президиум","презорство","презрение","презренная","презренность","презренный","презритель","презрительность","презумпция","преизбыток","преимущество","прейскурант","преисподняя","прекарий","прекарист","преклонение","преклонность","прекос","прекословие","прекраснодушие","прекрасное","прекращение","прелат","прелатство","прелести","прелестная","прелестник","прелестница","прелесть","прелиминарии","прелина","преложение","преложитель","преложительница","преломление","преломляемость","преломлятель","прелость","прель","прельститель","прельстительница","прельстительность","прельщение","прелюбодей","прелюбодейка","прелюбодейство","прелюбодеяние","прелюд","прелюдик","прелюдирование","прелюдия","премиальные","премилашка","премирование","премия","премножество","премудрость","премьер","премьера","премьер-майор","премьер-министр","премьерство","премьерша","пренебрежение","пренебрежительность","пренеприятность","прение","прения","пренумерант","преобладание","преображение","Преображение","преобразование","преобразователь","преобразовательница","преобразовывание","преодоление","преосвященный","преосвященство","препарат","препаратор","препараторская","препараторша","препарация","препарирование","препарировка","препаровка","препаровочная","препинание","препинания","препирание","препирательство","преподавание","преподаватель","преподавательница","преподача","преподнесение","преподношение","преподобие","препозиция","Преполовение","препона","препоручение","препринт","препроводительная","препровождение","препятствие","препятство","препятствователь","прерафаэлит","прерафаэлиты","пререкание","прерия","прерогатива","прерывание","прерыватель","прерывистость","прерывность","пресбиопия","пресветлость","пресвитер","пресвитерианец","пресвитерианин","пресвитерианка","пресвитерианство","пресечение","преследование","преследователь","преследовательница","преследуемая","преследуемый","преследующий","пресмыкание","пресмыкательство","пресмыкающееся","пресмыкающиеся","пресноводность","пресное","пресность","преснота","пресс","пресса","пресс-атташе","пресс-бюро","пресс-конференция","пресс-маслёнка","пресс-ножницы","прессовальная","прессовальня","прессование","прессовка","прессовщик","прессовщица","пресс-папье","пресс-подборщик","пресс-порошок","пресс-релиз","пресс-форма","пресс-центр","прессшпан","преставление","престарелая","престарелость","престарелый","престидижитатор","престиж","престо","престол","Престол","престолонаследие","престолонаследник","преступление","преступник","преступница","преступное","преступность","пресыщение","пресыщенность","прет-а-порте","претворение","претендент","претендентка","претензия","претенциозность","претерпение","преткновение","претор","преторианец","преторианцы","преторий","преториум","преувеличение","преувеличенность","преувеличивание","преуменьшение","преумножение","преуспевание","преуспеяние","префект","префектура","преферанс","преферансист","преференция","префикс","префиксация","преходимость","преходящность","прецедент","прецизионность","прецизия","преципитат","Пречистая","прещение","преюдициальность","приарендовывание","приарканивание","прибавка","прибавление","прибавок","прибавочка","прибасёнка","прибасенник","прибаска","прибаутка","прибауточка","прибауточник","прибаутчик","прибаюкивание","прибеглая","прибеглый","прибежище","прибережье","прибивание","прибивка","прибинтовывание","прибирание","приближавшаяся","приближавшийся","приближающаяся","приближающийся","приближение","приближённая","приближённость","приближённый","приблизительность","приблудная","приблудник","приблудный","приблудыш","прибой","прибойник","приболотица","прибор","приборка","приборостроение","приборостроитель","приборчик","прибранность","прибрежница","прибрежье","приброска","прибывание","прибывающая","прибывающий","прибывшая","прибывший","прибыль","прибыльность","прибытие","прибыток","привада","приваженность","приваживание","привал","приваливание","привальное","привар","приваривание","приварка","приварок","приват-доцент","приват-доцентура","приватизация","приведение","привезённое","привенчивание","привереда","привередливость","привередник","привередница","привередничание","привередничество","приверженец","приверженка","приверженность","привёртка","привёртывание","привес","привеска","привесок","привет","приветец","приветствие","приветствование","привешивание","прививаемость","прививальщик","прививальщица","прививание","прививка","прививок","прививочек","привидение","привизг","привилегированная","привилегированность","привилегированный","привилегия","привинчивание","привитие","привкус","привлекательное","привлекательность","привлечение","привнесение","привод","приводка","приводнение","привоз","привозка","привой","приволакивание","приволока","приволье","привораживание","приворачивание","приворот","приворотник","приворотница","привратник","привратница","привскакивание","привыкание","привычка","привычное","привычность","привязанность","привязка","привязчивость","привязывание","привязь","привяливание","пригар","пригарина","пригаринка","пригарь","пригвождение","пригибание","приглаженность","приглаживание","приглашение","приглашённая","приглашённый","приглубость","приглубь","приглушение","приглушённость","пригляд","приглядевшееся","приглядка","приглядность","приглядчивость","приглядывание","приговаривание","приговор","приговорённая","приговорённый","приговорка","приговорочка","пригодность","пригожество","пригожесть","пригон","пригонка","пригораживание","пригорание","пригорелое","пригород","пригородка","пригородье","пригорожанин","пригорожанка","пригорок","пригорочек","пригоршня","пригорье","приготавливание","приготовишка","приготовление","приготовления","пригребание","пригрев","пригревание","пригудка","пригудочка","придавленная","придавленность","придавленный","придавливание","придание","приданница","приданое","придатки","придаток","придаточное","придача","придверник","придвигание","придворная","придворный","придел","приделывание","придерживание","придира","придирка","придирчивость","придорожник","придуманность","придумка","придумочка","придумщик","придумщица","придумывание","придурковатость","придурь","придыхание","приезд","приездка","приезжающий","приезжая","приезжий","приём","приёмистость","приёмка","приемлемость","приёмная","приёмник","приёмосдатчик","приёмочная","приёмщик","приёмщица","приёмы","приёмыш","приёмышек","приехавший","прижаривание","прижатие","приживаемость","приживал","приживалец","приживалка","приживальчество","приживальщик","приживальщица","приживание","приживка","приживление","прижигание","прижим","прижимание","прижимистость","прижимка","прижимщик","прижимщица","прижмуривание","приз","призба","призвание","призванный","призвук","приземистость","приземление","призёр","призёрша","призма","призмочка","признак","признание","признательность","призор","призрак","призрачность","призрение","призыв","призываемый","призывник","прииск","приискание","приискатель","приискательница","приискивание","приисковый","приказ","приказание","приказная","приказничиха","приказный","приказчик","приказчица","приказчицкая","приказывание","прикалывание","прикапливание","прикапывание","прикармливание","прикасание","прикатка","прикатывание","прикидка","прикидывание","прикипание","приклад","прикладка","прикладывание","приклеивание","приклейка","приклёпка","приклёпывание","приключение","приключения","прикованная","прикованность","прикованный","прикол","приколачивание","приколка","прикомандирование","прикопка","прикопление","прикорм","прикормка","прикосновение","прикосновенность","прикраивание","прикраса","прикрасы","прикрашивание","прикрепление","прикреплённость","прикровенность","прикройка","прикручивание","прикрыт","прикрытие","прикуп","прикупка","прикуривание","прикурка","прикус","прикуска","прилавок","прилавочек","прилагательное","приладка","прилаживание","прилегание","прилежание","прилежность","прилеп","прилепа","прилепливание","прилепы","прилёт","прилив","приливание","прилизанность","прилика","прилипаемость","прилипала","прилипание","прилипчивость","прилистник","прилитие","приличие","приличия","приличность","прилобок","прилов","приложение","приложимость","прилунение","прима","прима-балерина","примадонна","примаж","примазка","примазывание","примак","приманивание","приманка","приманчивость","примарка","примас","примасливание","примат","приматы","приматывание","примачивание","примащивание","применение","применимость","применяемость","пример","примеривание","примерка","примерность","примерочка","примерочная","примерчик","примерщик","примерщица","примесь","примёт","примета","приметка","примётка","приметливость","приметочка","приметы","примётывание","примечание","примечания","примечательность","примешивание","приминание","примиренец","примирение","примирённость","примиренчество","примиритель","примирительница","примирительность","примитив","примитивизм","примитивность","примораживание","приморец","приморье","примосток","примотка","примочка","примула","примус","примыкание","примысл","примычка","принадлежности","принадлежность","принайтовливание","принаряживание","приневоливание","принесение","принесённое","принижение","приниженность","принизывание","принимание","приноравливание","приноровка","приноровление","принос","приноситель","приносительница","приношение","принтер","принудиловка","принудительность","принуждение","принуждённость","принц","принцесса","принцип","принципал","принципат","принципиальность","принципии","принципия","принц-консорт","принц-регент","принюхивание","принятие","приобретатель","приобретательница","приобретательство","приобретение","приобретённое","приобщение","приовражье","приозерье","приор","приоритет","приостанавливание","приостановка","приостановление","приохочивание","припадание","припадок","припадочек","припадочная","припадочный","припай","припаивание","припайка","припаливание","припаривание","припарка","припарки","припарочка","припас","припасание","припасовка","припасы","припахивание","припашка","припев","припевание","припевка","припевки","припевочка","припёк","припёка","припекание","припертень","приперчивание","припечатывание","припечек","припечка","припиливание","припилка","приписание","приписка","приписник","приписочка","приписывание","припись","припихивание","приплав","приплавка","приплавление","приплавливание","приплата","приплачивание","приплёскивание","приплёсок","приплетание","приплетение","приплод","приплывание","приплытие","приплюснутость","приплюсовывание","приплющение","приплющивание","припляс","припляска","приплясывание","приподнимание","приподнятие","приподнятость","припой","припойка","приползание","приполок","приполочек","припомаживание","припоминание","припорашивание","припорох","припорошка","припосадка","приправа","приправка","приправление","припруживание","припрыг","припрыгивание","припрыжечка","припрыжка","припрыскивание","припрягание","припрядывание","припряжка","припрятание","припрятывание","припугивание","припудривание","припуск","припускание","припутывание","припухание","припухлость","припущенник","припыл","припыливание","прирабатываемость","прирабатывание","приработка","приработок","приравнивание","прирастание","приращение","приращивание","прирез","прирезание","прирезка","прирезывание","прирезь","приречье","природа","природовед","природоведение","природолюб","прирост","приросток","прируб","прирубание","прирубка","прируливание","приручение","присада","присадка","присадник","присадок","присаливание","присасывание","присборивание","присваивание","присвист","присвистка","присвистывание","присвоение","присвоитель","присвоительница","присворивание","присев","присевание","присед","приседание","присекание","приселение","присёлок","присёлочек","присеменник","присест","присечка","присказка","присказочка","присказывание","прискакивание","прискок","прискорбие","прискочка","присловица","присловка","присловье","присловьице","прислуга","прислуживание","прислужливость","прислужник","прислужница","прислужничество","прислушивание","присмаливание","присматривание","присмотр","приснащивание","присные","присовокупление","присоединение","присос","присоска","присосок","присочинение","приспешник","приспешница","приспешничество","приспосабливаемость","приспосабливание","приспособленец","приспособление","приспособленка","приспособленность","приспособленчество","приспособляемость","пристав","пристава","приставание","приставка","приставление","приставник","приставство","приставша","пристальность","пристанище","пристановка","пристанодержатель","пристанодержательница","пристанодержательство","пристанский","пристань","пристёгивание","пристойность","пристрагивание","пристраивание","пристрастие","пристрастка","пристрачивание","пристращивание","пристрел","пристреливание","пристрелка","пристроечка","пристрой","пристройка","пристрочка","приструнивание","пристук","пристукивание","приступ","приступка","приступление","приступок","приступочек","приступочка","пристыжение","пристыжённость","пристяжка","пристяжная","пристяжь","присуждение","присутствие","присутствовавший","присутствование","присутствующий","присуха","присучальщик","присучальщица","присучивание","присучка","присушивание","присушка","присущность","присыл","присылка","присыпание","присыпка","присыпочка","присыхание","присяга","присядка","присяжник","присяжничество","присяжный","притаивание","приталкивание","притапливание","притаптывание","притаскивание","притачивание","притачка","притвор","притвора","притворность","притворство","притворщик","притворщица","притворяшка","притворяшки","притекание","притёска","притеснение","притеснённая","притеснённый","притеснитель","притеснительница","притин","притир","притираемость","притирание","притирка","притиск","притискивание","притка","приток","притолка","притолока","притон","притонение","притоносодержатель","притоносодержательница","притончик","притоп","притоптывание","притопывание","притормаживание","приторность","приточка","приточник","притрава","притравка","притравление","притравливание","притруска","притуга","притужина","притупление","притупленность","притча","притык","притыкание","притычка","притягательность","притягивание","притяжение","притязание","притязатель","притязательность","приуготовление","приуготовления","приукрашение","приукрашивание","приумножение","приурочение","приуроченность","приурочивание","приутюживание","приутюжка","приучение","прифальцовка","прификс","прифуговка","прифуговывание","прихвастывание","прихват","прихватка","прихватывание","прихвостень","прихвостник","прихвостница","прихлёб","прихлебала","прихлебатель","прихлебательница","прихлебательство","прихлебник","прихлёбывание","прихлёстка","прихлёстывание","прихлоп","прихлопывание","приход","приходование","приходо-расходчик","приходящий","прихожанин","прихожанка","прихожая","прихорашивание","прихотливость","прихотник","прихотница","прихоть","прихрамывание","прихромка","прицветник","прицел","прицеливание","прицельность","прицеп","прицепка","прицепщик","прицепщица","причал","причаливание","причалка","причастие","причастник","причастница","причастность","причащение","причелина","причерчивание","причёсанность","причёска","причёсывание","причет","причетник","причетница","причина","причиндалы","причинение","причинность","причисление","причитальщица","причитание","причитывание","причмок","причмокивание","причт","причуда","причудливость","причудник","причудница","пришабривание","пришабровка","пришаркивание","пришвартовывание","пришедший","пришелец","пришелица","пришепётывание","пришёптывание","пришествие","пришибленность","пришивание","пришивка","пришлая","пришлец","пришлый","пришпиливание","пришпоривание","приштуковка","прищёлкивание","прищеп","прищепка","прищепление","прищепок","прищипка","прищипывание","прищур","прищуривание","прищурка","приют","приязненность","приязнь","приямок","приятелище","приятель","приятельница","приятельство","приятное","приятность","приятство","проба","пробег","пробежка","пробел","пробеливание","пробелка","пробель","пробельная","пробиваемость","пробивание","пробивка","пробирка","пробирование","пробитие","пробка","пробковение","проблема","проблематика","проблематичность","проблемность","проблеск","проблескивание","пробник","пробование","прободение","пробой","пробойка","пробоина","пробойник","пробойчик","пробор","проборка","проборчик","пробочка","пробочник","пробст","пробуждение","пробуксовка","пробуксовывание","пробуравливание","пробуривание","проваживание","провал","проваливание","провалина","провалище","провалье","провансаль","провар","проваривание","проварка","проващивание","провевание","проведение","проведывание","провеивание","проверка","провёртка","провёртывание","проверчивание","проверщик","проверщица","провес","провеска","проветривание","провешивание","провиант","провиантмейстер","провидение","провиденциализм","провидец","провидица","провизия","провизор","провизорша","провинка","провинность","провинциал","провинциализм","провинциалка","провинциальность","провинция","провинчивание","провисание","провитамин","провитамины","провод","проводимость","проводины","проводка","проводник","проводница","проводы","провожание","провожатая","провожатый","провожающая","провожающий","провождение","провоз","провозвестие","провозвестник","провозвестница","провозвещатель","провозвещение","провозгласитель","провозгласительница","провозглашение","провозка","провозоспособность","провокатор","провокаторство","провокаторша","провокация","проволока","проволочка","проволочник","провор","провора","проворачивание","проворность","проворство","проворье","провоцирование","провяливание","прогал","прогалина","прогалинка","прогалок","прогалочек","прогар","прогиб","прогибание","прогимназист","прогимназистка","прогимназия","проглаживание","проглатывание","проглядывание","прогнивание","прогноз","прогностика","проговаривание","проголодь","прогон","прогонка","прогонные","прогоны","прогорание","прогоркание","прогорклость","программа","программа-максимум","программирование","программист","программка","программность","прогребание","прогрев","прогреваемость","прогревание","прогресс","прогрессивка","прогрессивное","прогрессивность","прогрессизм","прогрессист","прогрессистка","прогрессия","прогрессы","прогрохотка","прогрызание","прогул","прогуливание","прогуливающаяся","прогуливающийся","прогулка","прогулочка","прогульщик","прогульщица","продавец","продавливание","продавлина","продавщица","продажа","продажная","продажность","продалбливание","продвигание","продвижение","продевание","продел","проделка","проделывание","продёргивание","продёржка","продерзость","продирание","продление","продмаг","продналог","продовольствие","продовольствование","продол","продолговатость","продолжатель","продолжательница","продолжение","продолжительность","продольник","продор","продотряд","продотрядчик","продразвёрстка","продубка","продублённость","продубливание","продув","продуваемость","продувальщик","продувание","продувка","продукт","продуктивность","продукты","продукция","продуманность","продумывание","продух","продушина","продушинка","продырявливание","продюсер","проедание","проезд","проездной","проезжающая","проезжающий","проезжая","проезживание","проезжий","проект","проектант","проектец","проектирование","проектировка","проектировочная","проектировщик","проектировщица","проектор","проекция","проём","проецирование","прожаренность","прожаривание","прожарка","прожёвывание","прожект","прожектёр","прожектёрка","прожектёрство","прожектор","прожекторист","прожелть","прожжённость","проживалка","проживальщик","проживание","прожига","прожигание","прожигатель","прожигательница","прожилина","прожилка","прожилок","прожилочка","прожиривание","прожировка","прожитие","прожитое","прожиток","прожог","прожора","прожорливость","проза","прозаизм","прозаик","прозаист","прозаическое","прозаичность","прозвание","прозвище","прозектор","прозекторская","прозекторство","прозектура","прозелень","прозелит","прозелитизм","прозелитка","прозодежда","прозолоть","прозопопея","прозор","прозорливец","прозорливица","прозорливость","прозрачность","прозрение","прозубривание","прозябание","проигрывание","проигрыватель","проигрыш","пройда","пройденное","пройди-свет","пройдоха","пройдошества","пройдошество","пройдошничание","пройдошничество","произведение","производитель","производительность","производная","производное","производность","производственник","производственница","производство","произвол","произволение","произвольность","произнесение","произношение","произрастание","произрождение","пройма","проймочка","происки","проистекание","происходившее","происходящее","происхождение","происшедшее","происшествие","прок","прокажённая","прокажённый","проказа","проказливость","проказник","проказница","прокаливаемость","прокаливание","прокалка","прокалывание","прокальщик","прокамбий","прокапчивание","прокапывание","прокармливание","прокат","прокатка","прокатная","прокатный","прокатчик","прокатывание","прокачивание","прокачка","прокашивание","прокашливание","проквашивание","прокидка","прокидывание","прокимен","прокисание","прокислое","прокладка","прокладочка","прокладчик","прокладывание","прокладыватель","прокламация","прокламирование","проклёвывание","проклеивание","проклейка","проклейщик","проклейщица","проклёпка","проклёпывание","проклинание","проклитика","проклятая","проклятие","проклятик","проковка","проковывание","проковыривание","прокол","проколачивание","проколка","проколупывание","проконопачивание","проконсул","проконсульство","прокоп","прокопка","прокорм","прокормитель","прокормка","прокормление","прокос","прокосчик","прокраска","прокрахмаливание","прокрашивание","прокрой","прокрутка","прокручивание","проктит","проктолог","проктология","прокуда","прокурат","прокуратница","прокуратор","прокуратура","прокуривание","прокурка","прокурор","прокуроришко","прокурорство","прокурорша","прокус","прокусывание","прокучивание","пролагатель","пролаз","пролаза","пролазничество","проламывание","пролащивание","пролегание","пролегомены","пролежень","пролежка","пролежни","пролезание","пролепка","пролеска","пролесок","пролёт","пролетание","пролетариат","пролетаризация","пролетаризирование","пролетарий","пролетарка","пролётка","пролеткульт","пролеткультовец","пролёточка","пролетье","пролив","проливание","проливатель","проливень","проливчик","пролитие","пролог","Пролог","проложение","пролом","проломление","пролонгация","пролысина","пролысинка","пролювий","промазка","промазывание","промалывание","промасливание","проматывание","промах","промачивание","промашка","промедление","промежность","промежуток","промельк","промемория","промен","промена","променад","променаж","променивание","променуар","промер","промерзаемость","промерзание","промеривание","промес","прометание","Прометей","прометей","прометий","промётка","промётывание","промешивание","промилле","промин","проминаж","проминание","проминка","промискуитет","промозглость","промоина","промокаемость","промокание","промокашка","промол","промолвка","промораживание","промоция","промочка","промтовар","промтовары","промульгация","промыв","промывальщик","промывальщица","промывание","промывательное","промывка","промывная","промывщик","промывщица","промыливание","промысел","промысл","Промыслитель","промыслитель","промыслительница","промысловик","промышление","промышленник","промышленница","промышленность","пронашивание","пронесение","пронзительность","пронизка","пронизывание","пронизь","проникновение","проникновенность","пронимание","проницаемость","проницание","проницательность","проножка","прононс","пронос","пронунсиаменто","пронунциаменто","проныра","пронырливость","пронырство","пронюхивание","прообраз","проолифка","пропаганда","пропагандирование","пропагандист","пропагандистка","пропадание","пропажа","пропаивание","пропалывание","пропан","пропаривание","пропариватель","пропарка","пропарщик","пропарщица","пропарывание","пропастина","пропасть","пропахивание","пропашка","пропашник","пропашные","пропащая","пропащий","пропеллер","пропемзовывание","проперчивание","пропетие","пропечатывание","пропивание","пропил","пропилеи","пропилен","пропиливание","пропилка","пропиловка","пропинация","прописи","прописка","прописывание","пропись","пропитание","пропитанность","пропитие","пропитка","пропитчик","пропитывание","пропихивание","проплав","проплавка","проплавливание","пропласток","проплетание","проплетение","проплешина","проплешинка","проплыв","проплющивание","проповедание","проповедник","проповедница","проповедничество","проповедование","проповедователь","проповедчик","проповедь","пропоец","пропой","пропойство","пропойца","прополаскивание","прополис","прополка","прополочная","пропорциональность","пропорция","пропотевание","проприетар","проприетер","пропс","пропудривание","пропуск","пропускание","пропятие","прораб","прорабатывание","проработка","прорабская","проран","прорастаемость","прорастание","проращение","проращивание","прорва","проредь","прореживание","прорез","прорезание","прорезинение","прорезинивание","прорезинка","прорезка","прорезывание","прорезь","прорекание","проректор","прореха","проречение","прорешка","прорисовка","прорисовывание","прорись","прорицание","прорицатель","прорицательница","пророк","пророст","проросток","прорость","пророчество","пророчица","проруб","прорубание","прорубка","прорубь","проруха","прорыв","прорывание","прорыжь","прорытие","просадка","просаживание","просак","просаливание","просасывание","просачивание","просватание","просватывание","просверкивание","просверливание","просвет","просветитель","просветительница","просветительство","просветление","просветлённость","просвечиваемость","просвечивание","просвещенец","просвещение","просвещенка","просвещённость","просвира","просвирка","просвирная","просвирник","просвирниковые","просвирня","просвирняк","просвист","просев","просевание","просевка","проседание","проседь","просеивание","просек","просека","просекание","просёлок","просечка","просиживание","просимое","просинь","проситель","просительница","просительность","просияние","проскабливание","проскакивание","проскальзывание","проскачка","проскок","проскомидия","проскребание","проскрипция","проскурняк","прославление","прославленность","прослаивание","проследование","прослеживание","прослоек","прослоечка","прослой","прослойка","прослоина","прослушание","прослушивание","просмаливание","просматривание","просмолка","просмотр","просо","просов","просовывание","просодия","просол","просолка","просонки","просонок","просорушка","просос","проспект","просрочка","проставление","простаивание","простак","простата","простатит","простачка","простачок","простёгивание","простёжка","простейшее","простейшие","простенок","простень","простец","прости","простилание","простирание","простирывание","проституирование","проститут","проститутка","проституция","простоватость","простодушие","простодушность","простое","простой","простокваша","простолюдин","простолюдинка","простолюдье","простонародность","простонародье","простор","просторечие","просторность","простосердечие","простосердечность","простота","простофильство","простофиля","пространность","пространственность","пространство","прострация","прострачивание","прострел","простреливание","прострочка","простуда","простуживание","простукивание","проступание","проступок","проступочек","простушка","простынка","простыня","простяга","простяк","простячка","простячок","просуха","просушивание","просушка","просфира","просфирка","просфора","просфорка","просфорная","просфорня","просцениум","просчёт","просыпание","просыхание","просьба","просьбица","просьбишка","просянище","просянка","просящая","просящий","протагонист","протагонистка","протазан","протаивание","протактиний","проталина","проталинка","проталкивание","проталь","протапливание","протаптывание","протаргол","протаривание","протаскивание","протачивание","протеже","протежирование","протез","протезирование","протезист","протеид","протеин","протёк","протекание","протектор","протекторат","протекторство","протекционизм","протекционист","протекция","протекшее","протерозой","протёс","протёска","протест","протестант","протестантизм","протестантка","протестантство","протестация","протёсывание","протечка","против","противень","противление","противник","противница","противное","противность","противоборец","противоборник","противоборствие","противоборство","противовес","противогаз","противодавление","противодействие","противоестественность","противозаконность","противозвучие","противопоказание","противоположение","противоположное","противоположность","противопоставление","противопоставленность","противоречивость","противоречие","противоречия","противосияние","противостояние","противотела","противотело","противотечение","противоток","протирание","протирка","протирщик","протирщица","протискивание","протобестия","протограф","протодьякон","протоиерей","протоиерейша","проток","протока","протоканалья","протокол","протоколизм","протоколирование","протоколист","протокольность","протокольчик","протон","протопка","протоплазма","протопоп","протопопица","протопопша","протопресвитер","проторение","проторённость","протори","проторозавр","прототип","проточина","проточка","проточность","протрава","протравитель","протравка","протравление","протравливание","протравливатель","протрезвление","протрёп","протрёпывание","протуберанец","протуберанцы","протухание","протухлость","протыкание","протягивание","протяжение","протяжённость","протяжка","протяжность","проулок","проулочек","проутюживание","проух","проуха","проушина","профан","профанатор","профанация","профанирование","профессионал","профессионализация","профессионализм","профессионалист","профессионалка","профессия","профессор","профессорская","профессорство","профессорша","профессура","профи","профилактика","профилирование","профилировка","профиль","профит","проформа","профос","профсоюз","прохаживание","прохвост","прохлада","прохладительное","прохладность","прохлады","прохлаждение","проход","проходец","проходившая","проходивший","проходимец","проходимица","проходимка","проходимость","проходка","проходная","проходчик","проходчица","проходящая","проходящее","проходящий","прохожая","прохождение","прохожий","процарапывание","процветание","процедура","процедурная","процеживание","процент","процентовка","процентщик","процентщица","проценты","процесс","процессия","прочее","прочеканивание","прочерк","прочёркивание","прочерчивание","прочёс","прочёсывание","прочёсыватель","прочёт","прочие","прочистка","прочитанное","прочитывание","прочищение","прочность","прочтение","прочтённое","прочувствование","прочувствованное","прочувствованность","прошва","прошедшее","прошение","прошеньице","прошибка","прошивальщик","прошивальщица","прошивание","прошивень","прошивка","прошкуривание","прошлифовывание","прошлогоднее","прошлое","прошнуровка","прошнуровывание","проштопывание","прощание","прощелина","прощелыга","прощелыжник","прощение","прощенник","прощупывание","проявитель","проявка","проявление","проявщик","прояснение","пруд","прудик","прудишко","прудовик","прудовики","прудок","прудонизм","прудонист","пружина","пружинистость","пружинка","пружинность","пружок","прус","прусак","прусик","прусс","пруссак","пруссаки","пруссачка","пруссы","прут","прутик","прутинка","прутняк","пруток","пруточек","прутье","прутьё","прыгалка","прыгание","прыгающие","прыгун","прыгунчик","прыгуны","прыгунья","прыгучесть","прыжок","прыск","прыскалка","прыскание","прыски","прыткость","прыть","прыщ","прыщавость","прыщеватость","прыщик","прюнель","пря","прягла","прядание","прядево","прядение","прядильня","прядильщик","прядильщица","прядка","прядомость","прядочка","прядь","пряжа","пряженец","пряженик","пряжечка","пряжка","прялица","прялка","прялочка","прямая","прямизна","прямик","прямило","прямление","прямодушие","прямокрылые","прямолинейность","прямослойность","прямота","прямоток","прямоугольник","прямоугольничек","пряник","пряничек","пряничная","пряничник","пряности","пряность","прясельник","пряслица","пряслице","прясло","прясница","прятание","прятки","прятушки","прятышки","пряха","псалмист","псалмограф","псалмодия","псалмопевец","псалмопение","псалом","псаломщик","псаломщица","псалтерион","псалтирь","псалтырник","псалтырщик","псалтырщица","псалтырь","псальм","псальма","псальмопевец","псамма","псаммит","псаммиты","псаммон","псаммофил","псаммофилы","псаммофит","псаммофиты","псарня","псарь","псевдоартроз","псевдогаллюцинация","псевдоготика","псевдокристалл","псевдоморфоза","псевдонаука","псевдонаучность","псевдоним","псевдоподии","псевдоподия","псевдоромантизм","псевдоромантик","псевдоромантика","псевдотуберкулёз","псевдоучёность","псевдоучёный","псёнок","пси","псина","псих","психастеник","психастеничка","психастения","Психея","психиатр","психиатрия","психизм","психика","психическая","психический","психическое","психия","психоанализ","психоаналитик","психогенез","психогенезис","психогения","психоз","психолог","психологизирование","психологизм","психологист","психологичность","психология","психометрия","психоневроз","психоневролог","психоневрология","психоневротик","психопат","психопатизм","психопатия","психопатка","психопатолог","психопатология","психотерапевт","психотерапия","психотехника","психофизика","психофизиолог","психофизиология","психрограф","психрометр","психрометрия","псица","псише","псовая","псовина","псовка","псовые","птаха","пташечка","пташка","птенец","птенчик","птеранодон","птеродактиль","птерозавр","птиалин","птифур","птица","птицевод","птицеводство","птицеед","птицезвери","птицекомбинат","птицелов","птицеловство","птицемлечник","птиценожка","птицефабрика","птицеферма","птичка","птичка-невеличка","птичник","птичница","птичня","птушка","пуаз","пуансовка","пуансон","пуант","пуантилизм","пуантилист","пуантилье","пуанты","публика","публикатор","публикация","публикование","публицист","публицистика","публицистичность","публицистка","публичность","пугалище","пугало","пугание","пугач","пугачёвец","пугачёвщина","пугливость","пуговица","пуговичка","пуговичник","пуговичница","пуговка","пуговник","пуговочка","пуголовка","пуд","пудель","пудик","пудинг","пудишко","пудлингование","пудлинговка","пудлинговщик","пудовик","пудовичок","пудовка","пудо-фут","пудра","пудрение","пудреница","пудрет","пудрильщик","пудрильщица","пудровка","пудромант","пудромантель","пузан","пузанок","пузанчик","пузатость","пузо","пузырёк","пузыреногие","пузырёчек","пузырик","пузыристость","пузырник","пузырница","пузырчатка","пузырчатковые","пузырь","пук","пукли","пукля","пул","пула","пулемёт","пулемётик","пулемётишко","пулемётчик","пулемётчица","пулечка","пуло","пуловер","пульверизатор","пульверизаторщик","пульверизация","пулька","пульман","пульпа","пульпит","пульпитр","пульповод","пульпомер","пульпопровод","пульс","пульсатор","пульсация","пульсиметр","пульсирование","пульсометр","пульт","Пульчинелла","Пульчинель","пуля","пулярда","пулярка","пума","пунец","пункт","пунктик","пунктир","пунктирование","пунктировка","пунктировщик","пунктуальность","пунктуация","пункция","пуночка","пунсон","пунцон","пунш","пуншик","пунька","пуня","пуп","пупавка","пупавник","пуповина","пупок","пупочек","пупочка","пупс","пупсик","пупырышек","пупырышки","пупырь","пураны","пурга","пурганец","пургатив","пургаторий","пурген","пуризм","пурин","пурины","пурист","пуристка","пуритане","пуританизм","пуританин","пуританка","пуританство","пурка","пурпур","пурпура","пурпурин","пуск","пускание","пускатель","пускач","пустельга","пустка","пусто","пустобай","пустоболт","пустобрёх","пустование","пустоватость","пустоголов","пустоголовая","пустоголовость","пустоголовый","пустограй","пустодом","пустодомка","пустодомство","пустодушие","пустое","пустозвон","пустозвонка","пустозвонство","пустозёрница","пустозёрность","пустоколосица","пустолайка","пустомельство","пустомеля","пустоплесье","пустоплёт","пустопляс","пустополье","пустопоместье","пусторечие","пусторосль","пустосвят","пустосвятка","пустосвятство","пустослов","пустословие","пустословка","пустосум","пустота","пустотность","пустоты","пустоцвет","пустошка","пустошовка","пустошь","пустула","пустушка","пустынник","пустынница","пустынничество","пустынножитель","пустынножительница","пустынножительство","пустынность","пустынь","пустынька","пустыня","пустырёк","пустырник","пустырь","пустышка","пустяк","пустяковина","пустяковщина","пустячность","пустячок","путана","путание","путаник","путанина","путаница","путанность","путёвка","путеводец","путеводитель","путеводительница","путёвочка","путеец","путеобходчик","путеобходчица","путепогрузчик","путеподъёмник","путепровод","путеследование","путеукладка","путеукладчик","путец","путешественник","путешественница","путешествие","путешествия","путешествование","путешествователь","путешествующая","путешествующий","пути","путик","путина","путинный","путлище","путник","путница","путное","путность","путо","путч","путчизм","путчист","путы","путь","пуф","пуфик","пуффин","пух","пухлина","пухловатость","пухлость","пухлявость","пухляк","пухлячок","пуховик","пуховичок","пуховка","пуховочка","пуховщик","пуховщица","пухоед","пухоотделитель","пуццолан","пуццолана","пучеглазие","пучение","пучина","пучка","пучкожаберные","пучок","пучочек","пушбол","пушение","пушечка","пушинка","пушиночка","пушистость","пушица","пушка","пушкарь","пушник","пушнина","пушок","пуща","пфенниг","пчела","пчелинец","пчёлка","пчеловод","пчеловодство","пчелоед","пчелосемья","пчёлочка","пчельник","пчельница","пчельня","пчеляк","пшат","пшеница","пшеничка","пшеничник","пшёнка","пшённик","пшено","пшенцо","пшик","пшют","пыж","пыжик","пыжьян","пыл","пылание","пыленепроницаемость","пыление","пылеобразование","пылеочиститель","пылесос","пылеуловитель","пылинка","пылиночка","пылища","пылкость","пыль","пыльник","пыльца","пыльцеед","пырей","пырейник","пырник","пырскание","пыряние","пытание","пытатель","пытка","пытливость","пых","пыхтение","пышечка","пышечная","пышка","пышность","пьедестал","пьеза","пьекса","пьексы","Пьеро","пьеса","пьеска","пьющий","пьяная","пьяника","пьяница","пьянка","пьянство","пьянчуга","пьянчужка","пьяный","пьянюга","пьянюжка","пэр","пэрство","пюльпитр","пюпитр","пюре","пяденица","пядень","пядница","пядь","пяла","пяление","пялка","пяло","пялы","пяльцы","пястка","пясть","пята","пятак","пятачок","пятая","пятерик","пятёрка","пятерня","пятёрочка","пятёрочник","пятёрочница","пятиалтынник","пятиалтынничек","пятиалтынный","пятиборец","пятиборье","пятивёрстка","пятиглавие","пятидесятая","пятидесятикопеечная","пятидесятилетие","пятидесятирублёвая","пятидесятник","пятидесятники","Пятидесятница","пятидесятница","пятидесятый","пятидневка","пятиклассник","пятиклассница","Пятикнижие","пятикопеечная","пятикопеечник","пятилетие","пятилетка","пятилинейка","пятиминутка","пятина","пятирублёвая","пятирублёвка","пятисотая","пятисотенник","пятисотенный","пятисотка","пятисотлетие","пятисотрублёвая","пятисотый","пятистенка","пятитонка","пятитысячная","пятитысячный","пятиугольник","пятиустка","пятичасовой","пятка","пятна","пятнадцатая","пятнадцатилетие","пятнадцатый","пятнание","пятнашки","пятник","пятнистость","пятница","пятно","пятнышко","пятое-десятое","пяток","пяточек","пяточка","пятый","пять","раб","раба","рабатка","рабкрин","рабовладелец","рабовладельчество","рабовладение","раболепие","раболепство","раболепствование","работа","работёнка","работёшка","работишка","работища","работка","работник","работница","работничек","работодатель","работорговец","работорговля","работоспособность","работы","работяга","рабочая","рабочий","рабство","рабфак","рабфаковец","рабыня","раввин","равелин","равендук","равенство","равентух","равная","равнение","равнина","равнинка","равнинность","равновесие","равноденствие","равнодушие","равнозначность","равномерность","равноправие","равноправность","равноценность","равный","рагу","рада","Рада","радар","раделец","раделица","радельник","радельница","радельщик","радельщица","радение","радетель","радетельница","радетельность","раджа","радиальность","радиан","радиант","радиатор","радиация","радий","радикал","радикализм","радикалист","радикалка","радикальность","радикулит","радимич","радимичи","радио","радиоактивность","радиоальтиметр","радиоантенна","радиоаппаратура","радиоастрономия","радиовещание","радиоволна","радиоволны","радиограмма","радиозонд","радиоизлучение","радиокомментатор","радиокомпас","радиола","радиолампа","радиолог","радиология","радиолокатор","радиолокация","радиолюбитель","радиолюбительство","радиолярии","радиомачта","радиомаяк","радиометр","радионавигация","радиопеленг","радиопеленгатор","радиопередатчик","радиопередача","радиоперекличка","радиоперехват","радиопомехи","радиоприём","радиоприёмник","радиорепортаж","радиорепродуктор","радиорубка","радиосвязь","радиосеть","радиослужба","радиослушатель","радиостанция","радиостудия","радиотелеграмма","радиотелеграф","радиотелеграфист","радиотелеграфистка","радиотелеграфия","радиотелескоп","радиотелефон","радиотерапия","радиотехник","радиотехника","радиоточка","радиотрансляция","радиоузел","радиоустановка","радиофизика","радиофикация","радиохимия","радиоцентр","радиоэлектроника","радиоэхо","радист","радистка","радиус","радон","Радоница","радостное","радостность","радость","радуга","радужина","радужка","радужная","радужник","радужница","Радуница","радушие","раёк","раёшник","раж","раз","разбавитель","разбавление","разбазаривание","разбалтывание","разбег","разбегание","разбежка","разбел","разбелка","разбереживание","разбивание","разбивка","разбирание","разбирательство","разбитость","разбой","разбойник","разбойница","разбойничек","разбойничество","разболтанность","разбор","разборка","разборочная","разборчивость","разборщик","разборщица","разбраковка","разбраковщик","разбраковщица","разбрасывание","разбрасыватель","разброд","разброс","разбросанность","разброска","разбрызгивание","разбрызгиватель","разбуравливание","разбуривание","разбухание","развал","развалец","разваливание","развалина","развалины","развалка","развалы","развальца","развальцовка","развальцовщик","развальцовщица","развалюха","развалюшка","развар","разваривание","разварка","разварщик","разварщица","развевание","разведанность","разведение","разведённая","разведённый","разведка","разведсводка","разведчик","разведчица","разведывание","развеивание","развенчание","развенчивание","разверстание","развёрстка","развёрстывание","развёртка","развёртывание","разверчивание","развес","развеска","развесочная","развесчик","развесчица","развесы","разветвление","разветвлённость","развешивание","развив","развивание","развиватель","развивка","развилина","развилинка","развилка","развилок","развилочка","развинченность","развинчивание","развитие","развитость","развлекатель","развлекательница","развлекательность","развлечение","развод","разводка","разводчик","разводчица","разводы","разводье","разводящий","развоз","развозка","развозчик","развозчица","развой","разворачивание","разворовывание","разворот","разврат","развратитель","развратительница","развратник","развратница","развратность","развращение","развращённость","развьючивание","развязка","развязность","развязывание","разгадка","разгадчик","разгадчица","разгадывание","разгар","разгиб","разгибание","разгибатель","разгильдяй","разгильдяйка","разгильдяйство","разглагольствие","разглагольствование","разглагольствования","разглаживание","разглашатель","разглашательница","разглашение","разглядка","разглядывание","разговение","разговор","разговорник","разговорчивость","разговорчик","разговорчики","разговорщик","разговорщица","разговоры","разгон","разгонка","разгонная","разгонные","разгораживание","разгорание","разграбление","разграничение","разграничитель","разграфление","разгребание","разгребатель","разгрёбщик","разгром","разгромление","разгружатель","разгрузка","разгрузчик","разгрузчица","разгул","разгуливание","разгулье","раздавание","раздаватель","раздавательница","раздаивание","раздалбливание","раздаривание","раздаточная","раздатчик","раздатчица","раздача","раздваивание","раздвигание","раздвижение","раздвижка","раздвоение","раздвоенность","раздевалка","раздевальная","раздевальня","раздевание","раздел","разделение","разделитель","разделительность","разделка","разделочная","разделывание","раздельнолепестные","раздельнополость","раздельность","раздельщик","раздельщица","раздёрганность","раздёргивание","раздирание","раздирщик","раздирщица","раздой","раздол","раздолье","раздольице","раздор","раздорожье","раздражение","раздражённость","раздражимость","раздражитель","раздражительность","раздробление","раздробленность","раздроблённость","раздув","раздувание","раздумчивость","раздумье","раздутие","раздутость","разевание","разжалование","разжалованная","разжалованный","разжатие","разжёвывание","разжива","разжиг","разжига","разжигание","разжижение","разжижка","разжим","разжимание","раззавод","раззадоривание","раззолачивание","раззява","разик","разиня","разительность","разлагание","разлагатель","разлад","разладица","разладка","разлаженность","разлаживание","разламывание","разлапушка","разлёт","разлетай","разлетайка","разлетайчик","разлив","разливальщик","разливальщица","разливание","разливатель","разливательница","разливка","разливщик","разливщица","разлиновка","разлиновывание","разлитие","различение","различие","различность","разложение","разложимость","разлом","разлука","разлучение","разлучник","разлучница","размагниченность","размагничивание","размазня","размазывание","размалёвка","размалёвывание","размалывание","разматывание","размах","размахай","размахайка","размахивание","размачивание","размачтовывание","размашистость","размашка","размежевание","размежёвка","размежёвывание","размельчение","размен","разменивание","размер","размеренность","размеривание","размёт","разметание","размётанность","размётистость","разметка","разметчик","разметчица","размётывание","размешивание","размещение","разминание","разминирование","разминка","разминовка","размирье","размножение","размоина","размокание","размол","размолвка","размолка","размольщик","размольщица","размораживание","размотка","размотчик","размотчица","размочаливание","размочка","размыв","размываемость","размывание","размывка","размыкание","размыкатель","размысл","размышление","размягчение","размягчённость","разнарядка","разнашивание","разнеженность","разнесение","разнимание","разница","разнобой","разнобоярщина","разноверие","разноверцы","разновес","разновеска","разновесок","разновидность","разновременность","разнога","разногласие","разногласица","разноголосие","разноголосица","разнодомность","разнодомные","разное","разножка","разнозвучие","разнокалиберность","разнокалиберщина","разнолесье","разнолистность","разноличность","разномыслие","разноначалие","разнообразие","разнообразность","разноплемённость","разнопряжка","разнорабочая","разнорабочий","разноречивость","разноречие","разнородность","разнорыбица","разнорядица","разнорядка","разнос","разноситель","разносительница","разноска","разносолы","разноспоровые","разностильность","разносторонность","разность","разносчик","разносчица","разнота","разнотипность","разнотравье","разнохарактерность","разноцвет","разноцветность","разноцветье","разночинец","разночинство","разночтение","разношёрстность","разноязычие","разнузданность","разнуздывание","разоблачение","разоблачитель","разоблачительница","разобщение","разобщённость","разовые","разогнание","разогрев","разогревание","разодрание","разок","разопревание","разор","разорванность","разорение","разорённость","разоритель","разорительница","разорительность","разоружение","разочарование","разочарованность","разочарователь","разочаровывание","разочек","разрабатывание","разработанность","разработка","разработки","разравнивание","разражение","разрастание","разращение","разрежение","разрежённость","разрез","разрезальщик","разрезальщица","разрезание","разрезка","разрезывание","разрешение","разрешимость","разрешитель","разрешительница","разрисовка","разрисовщик","разрисовщица","разрисовывание","разрозненность","разрознивание","разруб","разрубание","разрубка","разрубщик","разруха","разрушение","разрушимость","разрушитель","разрушительница","разрушительность","разрыв","разрывание","разрыв-трава","разрытие","разрыхление","разрыхлитель","разряд","разрядка","разрядник","разрядница","разрядность","разряжение","разряженность","разряжённость","разубеждение","разувание","разуверение","разузнавание","разузнание","разукрупнение","разум","разумение","разумник","разумница","разумное","разумность","разуплотнение","разутюживание","разухабистость","разучивание","разъедание","разъединение","разъединённость","разъединитель","разъезд","разъездные","разъезды","разъезжание","разъём","разъёмность","разъёмщик","разъярение","разъярённость","разъяснение","разъяснитель","разъятие","разыграние","разыгрывание","разыскание","разыскания","разыскивание","рай","райграс","раина","район","районирование","рак","Рак","рака","ракета","ракета-носитель","ракетка","ракетница","ракетодром","ракетостроение","ракетчик","ракита","ракитка","ракитник","ракия","раклист","раковина","раковинка","раколов","ракообразные","рак-отшельник","ракурс","ракуша","ракушечник","ракушка","ракушковые","ракушник","ракша","рало","рама","рамадан","рамазан","рамбулье","рамка","рамки","рамоли","рамолик","рамооборот","рамочка","рамочник","рампа","рамс","рамщик","рана","ранг","рангоут","рандеву","раненая","ранение","раненый","ранет","ранетка","ранетки","ранец","ранжир","ранка","рант","рантье","рань","рапа","рапира","рапорт","рапортичка","рапс","рапсод","рапсодия","раритет","раса","расизм","расист","расистка","раскалённость","раскаливание","раскалывание","раскапывание","раскармливание","раскат","раскатка","раскатчик","раскатчица","раскаты","раскатывание","раскачивание","раскачка","раскаяние","расквартирование","расквартировка","раскидка","раскидчивость","раскидывание","раскисание","раскисление","расклад","раскладка","раскладушка","раскладчик","раскладчица","раскладывание","расклёв","расклевание","расклёвывание","расклеивание","расклейка","расклейщик","расклейщица","расклёпка","расклёпывание","расклёшивание","расклинивание","расковка","расковывание","расковыривание","раскол","расколачивание","расколка","расколоучитель","раскольник","раскольница","раскольничество","раскольщик","раскольщица","раскомандировка","раскомандировочная","раскомплектование","расконопачивание","раскопка","раскопки","раскорм","раскормка","раскорчёвка","раскоряка","раскорячка","раскос","раскосость","раскрадывание","раскраивание","раскрасавец","раскрасавица","раскраска","раскрасчик","раскрасчица","раскрашивание","раскрепление","раскрепощение","раскрой","раскройка","раскройщик","раскройщица","раскрутка","раскручивание","раскрывание","раскрытие","раскряжёвка","раскряжёвщик","раскулаченная","раскулаченный","раскулачивание","раскупоривание","раскупорка","раскур","раскуривание","раскурка","раскусывание","раскутывание","распад","распадение","распадина","распадок","распаивание","распайка","распаковка","распаковщик","распаковщица","распаковывание","распаление","распалубка","распар","распаривание","распарка","распарывание","распаужение","распаузка","распаханность","распахивание","распашка","распашник","распашонка","распашоночка","распев","распевание","распевец","распевность","распекание","распеканция","распекатель","распелёнывание","распечатание","распечатывание","распивание","распивочная","распил","распиливание","распилка","распиловка","распиловщик","расписание","расписка","расписочка","расписывание","распитие","распихивание","расплав","расплавка","расплавление","распланировка","распластывание","расплата","расплёскивание","расплетание","расплетение","расплод","распложение","расплывчатость","расплывчивость","расплющивание","расподобление","распознаваемость","распознавание","распознаватель","распознавательница","расползание","расположение","расположенность","распоп","распор","распорка","распорядитель","распорядительница","распорядительность","распорядительство","распорядительша","распорядок","распоряжение","распотешивание","распоясывание","расправа","расправка","расправление","распределение","распределитель","распродажа","распространение","распространённость","распространитель","распространительница","распрыскивание","распря","распрягание","распряжка","распрямление","распубликование","распугивание","распудривание","распуколка","распускаемость","распускание","распустёха","распутица","распутник","распутница","распутность","распутство","распутывание","распутье","распухание","распучивание","распущенность","распыл","распыление","распылённость","распыливание","распылитель","распяливание","распялка","распялочка","распятие","рассада","рассадка","рассадник","рассадница","рассаживание","рассасывание","рассверливание","рассверловка","рассвет","рассев","расседлание","рассёдлывание","рассеивание","рассекание","расселение","расселина","рассечение","рассечка","рассеяние","рассеянность","рассказ","рассказец","рассказик","рассказишко","рассказчик","рассказчица","рассказывание","расслабевание","расслабление","расслабленная","расслабленность","расслабленный","расслаивание","расследование","расследователь","расслоение","расслойка","рассматривание","рассмотрение","расснастка","расснащивание","рассовывание","рассол","рассоление","рассолец","рассольник","рассольничек","рассортировка","рассортировывание","рассоха","рассошина","расспрашивание","расспрос","расспросчик","расспросчица","рассредоточение","рассрочивание","рассрочка","расставание","расставка","расстание","расстанная","расстановка","расстановщик","расстановщица","расстегай","расстегайчик","расстёгивание","расстил","расстилание","расстилатель","расстилка","расстояние","расстояньице","расстраивание","расстрел","расстреливание","расстрелянная","расстрелянный","расстрига","расстрижение","расстройство","расстрочка","рассудительность","рассудок","рассудочность","рассуждение","рассуждения","рассусоливание","рассучивание","рассчитанность","рассчитывание","рассылание","рассылка","рассыльная","рассыльный","рассыпание","рассыпка","рассыпчатость","рассыпщик","рассыпщица","рассыхание","растабары","расталкивание","растапливание","растаптывание","растаскивание","растасовка","растачивание","раствор","растворение","растворимость","растворитель","растворомешалка","растворщик","растворяемость","растекание","растёл","растение","растениевод","растениеводство","растеньице","растепеля","растеребление","растеребливание","растерёха","растерзание","растерзанность","растеря","растерянность","растеряха","растёска","растёсывание","растечка","растильня","растирание","растирка","растирщик","растирщица","растительность","растлевание","растление","растленность","растлитель","растлительница","растолкование","растолковывание","растопка","растопыривание","растопырка","растопыря","расторжение","расторжимость","растормаживание","расторопность","расточение","расточитель","расточительница","расточительность","расточительство","расточка","расточник","растр","растрава","растравление","растравливание","растранжиривание","растрата","растратчик","растратчица","растрачивание","растрёпа","растрепай","растрёпанность","растрёпка","растрёпывание","растрескивание","растроганность","раструб","раструска","раструшивание","растряска","растрясывание","растушёвка","растушка","растыкивание","растюковка","растягивание","растяжение","растяжимость","растяжка","растянутость","растяпа","расфасовка","расфасовщик","расфасовщица","расфасовывание","расформирование","расформировка","расформировывание","расхаживание","расхваливание","расхватывание","расхититель","расхитительница","расхищение","расхлябанность","расхлябывание","расход","расходование","расходчик","расходчица","расходы","расхождение","расхолаживание","расцарапывание","расцвет","расцветание","расцветка","расцветчик","расцветчица","расцвечивание","расценивание","расценка","расценки","расценщик","расценщица","расцепка","расцепление","расчаление","расчаливание","расчалка","расчеканка","расчеканщик","расчерпывание","расчерчивание","расчёска","расчёсочка","расчёсывание","расчёт","расчётливость","расчётчик","расчётчица","расчисление","расчисленное","расчистка","расчищение","расчленение","расчленённость","расшаркивание","расшатанность","расшатывание","расшевеливание","расшива","расшивание","расшивка","расширение","расширитель","расширяемость","расшифровка","расшифровщик","расшифровывание","расшлихтовка","расшлихтовщик","расшнуровка","расштыбовщик","расщебёнка","расщелина","расщеп","расщепление","расщипка","расщипывание","ратай","ратания","ратафия","ратин","ратинирование","ратификация","ратник","ратные","ратоборец","ратоборство","ратование","ратовище","ратовье","ратуша","рать","раунд","раус","раут","раухтопаз","рафинад","рафинёр","рафинёрщик","рафинёрщица","рафинирование","рафинированность","рафинировка","рафинировщик","рафинировщица","рафия","рахат-лукум","рахит","рахитизм","рахитик","рахитичка","рацея","рацион","рационализатор","рационализаторство","рационализация","рационализм","рационалист","рационалистичность","рационалистка","рациональность","рационирование","рация","рацпредложение","рачение","рачитель","рачительница","рачительность","рачиха","рачишка","рачище","рачки","рачок","рачонок","рашпиль","ращение","рванина","рвань","рваньё","рвач","рвачество","рвение","рвота","рвотное","рдение","рдест","ре","реабилитация","реагент","реагирование","реактив","реактивность","реактор","реакционер","реакционерка","реакционность","реакция","реал","реализация","реализм","реалист","реалистичность","реалистка","реалия","реальгар","реальность","ребаб","ребе","ребёнок","ребёночек","реборда","ребристость","ребро","ребровик","рёбрышко","ребус","ребята","ребятёнок","ребятёночек","ребятишки","ребятки","ребятня","ребятьё","ребячество","ребячливость","рёв","рёва","ревакцинация","реванш","реваншизм","реваншист","реввоенсовет","ревенёк","ревень","ревенька","реверанс","ревербер","реверберация","реверс","реверси","реверсивность","реверсирование","реверсия","реверсор","ревизионизм","ревизионист","ревизионистка","ревизия","ревизование","ревизор","ревизорство","ревком","ревматизм","ревматик","ревматичка","ревнивец","ревнивица","ревнивость","ревнитель","ревнительница","ревностность","ревность","ревокация","револьвер","револьверишко","револьверчик","револьверщик","револьверщица","революционаризм","революционер","революционерка","революционерство","революционизирование","революционизм","революционист","революционность","революция","ревтрибунал","ревун","ревунья","ревю","регалии","регата","регби","регбист","регенерат","регенератор","регенераторщик","регенерация","регенерирование","регент","регентство","регентша","регион","регионализация","регионализм","регистр","регистратор","регистраторша","регистратура","регистрация","регистрирование","регламент","регламентация","регламентирование","реглан","реградация","регресс","регрессивность","регрессия","регулирование","регулировка","регулировщик","регулировщица","регулы","регулярность","регулятор","регуляция","редактирование","редактор","редакторство","редакторша","редактура","редакция","редан","редемаркация","редерер","редечка","редизна","редина","редингот","рединка","редис","редиска","редисочка","редкий","редкоземельные","редколесье","редколлегия","редкомах","редкостность","редкостойность","редкость","реднина","редняк","редова","редуктор","редукция","редупликация","редут","редуцирование","редька","редюит","реестр","режим","режиссёр","режиссёрство","режиссирование","режиссура","рез","резак","резальщик","резальщица","резание","резвости","резвость","резвун","резвунчик","резвунья","резвушка","резеда","резекция","резерв","резерват","резервация","резервирование","резервист","резервник","резервуар","резец","резидент","резиденция","резидирование","резина","резинка","резиночка","резинщик","резинщица","резиньяция","резка","резкость","резник","резня","резолюция","резон","резонанс","резонатор","резонёр","резонёрка","резонёрство","резонёрствование","резонирование","резонность","резорцин","результат","результативность","резуха","резчик","резчица","резь","резьба","резьбовик","резьбовщик","резьбовщица","резюме","резюмирование","рей","рейд","рейдер","рейдирование","рейдовик","рейка","рейнвейн","реинфекция","рейс","рейсмус","рейсфедер","рейсшина","рейтар","рейтер","рейтинг","рейтузы","рейхсвер","рейхсканцлер","рейхсрат","рейхстаг","река","рекамбио","рекамбия","рекапитуляция","реквием","реквизит","реквизитор","реквизиты","реквизиция","реклама","рекламация","рекламирование","рекламист","рекламистка","рекламодатель","рековедение","рекогносцирование","рекогносцировка","рекогносцировщик","рекомендатель","рекомендательница","рекомендация","рекомендующий","реконверсия","реконструирование","реконструкция","рекорд","рекордизм","рекордист","рекордистка","рекордсмен","рекордсменка","рекордсменство","рекостав","рекреация","рекредитив","рекрут","рекрутка","рекрутство","рекрутчина","ректификат","ректификатор","ректификация","ректифицирование","ректор","ректорат","ректорство","ректорша","рекуператор","рекуперация","реле","релейщик","религиозность","религия","реликвия","реликт","рельеф","рельефность","рельс","рельса","рельсина","рельсопрокатка","рельсопрокатная","рельсопрокатчик","рельсы","релятивизм","релятивист","релятивное","реляция","ремарка","ремедиум","ремез","ременщик","ремень","ремень-рыба","ремесленник","ремесленница","ремесленничество","ремесленное","ремесленность","ремесло","ремешечник","ремешник","ремешок","ремиз","ремилитаризация","реминисценция","ремиссия","ремнец","ремнецветник","ремнецветные","ремни","ремнище","ремонт","ремонтантность","ремонтёр","ремонтирование","ремонтировщик","ремонтник","рената","ренегат","ренегатка","ренегатство","Ренессанс","ренессанс","ренет","рений","ренклод","реноме","ренонс","рента","рентабельность","рентген","рентгенизация","рентгенограмма","рентгенография","рентгенодиагностика","рентгенолог","рентгенология","рентгеноскопия","рентгенотерапия","реометр","реорганизация","реостат","репа","репарация","репатриант","репатриантка","репатриация","репатриированная","репатриированный","репатриируемая","репатриируемый","репеёк","репей","репейник","репер","репертуар","репетир","репетирование","репетитор","репетиторство","репетиторша","репетиция","репетование","репица","репище","репка","реплика","репняк","репозиция","реполов","репортаж","репортёр","репортёрство","репортёрша","репрезентант","репрезентация","репрессалия","репрессивность","репрессированная","репрессированный","репрессия","реприза","реприманд","репринт","репродуктор","репродукция","репродуцирование","репс","рептилии","рептилия","репутация","репьё","репьяк","ресивер","ресконтро","рескрипт","ресница","ресницы","ресничка","реснички","ресничные","респект","респектабельность","респиратор","респирация","респондент","респондентка","республика","республиканец","республиканизм","республиканка","рессора","рессорщик","реставратор","реставраторство","реставрация","реституция","ресторан","ресторанчик","ресторанщик","ресторатор","ресторация","ресурс","ресурсы","ретивое","ретивость","ретина","ретинит","ретирада","реторсия","реторта","ретранслятор","ретрансляция","ретраншемент","ретроград","ретроградка","ретроградность","ретроградство","ретроспектива","ретроспекция","ретрофлексия","ретрофлексный","ретушёвка","ретушёр","ретуширование","ретушь","реферат","референдум","референт","рефери","рефлекс","рефлексия","рефлексолог","рефлексология","рефлектёр","рефлектёрство","рефлективность","рефлектометр","рефлектор","реформа","реформат","реформатка","реформатор","реформатство","реформаты","Реформация","реформация","реформизм","реформирование","реформист","реформистка","рефрактометр","рефрактометрия","рефрактор","рефракция","рефрен","рефрижератор","рефулёр","рецензент","рецензентство","рецензийка","рецензирование","рецензия","рецепт","рецептик","рецептор","рецептура","рецепция","рецессивность","рецидив","рецидивист","рецидивистка","реципиент","реципиентка","рецитация","рецитирование","речение","реченька","речечка","речивость","речистость","речитатив","речка","речник","речонка","речушка","речь","решаемость","решение","решённое","решетина","решётка","решетник","решето","решёточка","решётце","решетцо","решечение","решимость","решительность","решка","рештак","реэвакуация","реэвакуированная","реэвакуированный","реэкспорт","реэмигрант","реэмигрантка","реэмиграция","реюшка","рея","реяние","ржа","ржавление","ржавость","ржавчина","ржавчинка","ржавчинник","ржавчинные","ржавь","ржание","ржанина","ржаница","ржанище","ржанка","ржица","ржичка","ржишка","ржище","риал","рибофлавин","риваль","ривалька","риванол","рига","ригель","ригодон","ригоризм","ригорист","ригористичность","ригористка","ридикюль","ридикюльчик","риза","ризалит","ризеншнауцер","ризки","ризница","ризничий","ризоид","ризоиды","ризосфера","ризотто","рикошет","рикошетирование","рикша","римляне","римлянин","римлянка","ринг","ринит","ринк","ринология","ринопластика","рипус","рис","рисберма","рисинка","риск","риска","рискованность","рислинг","рисовальщик","рисовальщица","рисование","рисовка","рисовод","рисоводство","ристалище","ристание","ристатель","рисунок","рисуночек","ритм","ритмизация","ритмика","ритмичность","ритмовка","ритмопластика","ритор","риторизм","риторика","риторичность","риторство","ритуал","ритурнель","риф","рифление","рифлёность","рифли","рифма","рифмач","рифмачество","рифмачка","рифмование","рифмовка","рифмоплёт","рифмоплётство","рифмотворец","рифмочка","рифовые","рихтование","рихтовка","рихтовщик","рихтовщица","рицинус","ришелье","ришта","ро","роба","роббер","робинзон","робинзонада","робкий","робость","робот","роброн","ров","ровесник","ровесница","ровик","ровнитель","ровница","ровничница","ровность","ровнота","ровнюшка","ровня","рог","рога","рогалик","рогаль","рогатина","рогатинка","рогатка","рогатки","рогатый","рогач","роговик","роговина","роговица","рогожа","рогожина","рогожка","рогожник","рогожница","рогоз","рогоза","рогозовые","рогозуб","роголистник","роголистниковые","рогоносец","рогулечка","рогулина","рогулька","рогульник","рогуля","род","родий","родильница","родимец","родимушка","родимчик","родимые","родимый","родина","Родина","родинка","родины","родители","родитель","родительница","Родительская","родич","родная","родненькие","родненький","родник","родничок","родное","родной","родные","родня","родовитость","родович","родовспоможение","рододендрон","родоначальник","родоначальница","родонит","родословец","родословие","родословная","родственник","родственница","родственничек","родственность","родство","роды","роевня","роёвня","роёвщина","роёк","роение","рожа","рожак","рождаемость","рождение","рожденник","рожденница","Рождество","роженица","рожечник","рожица","рожок","рожон","рожочек","рожь","роза","розан","розанель","розанец","розанцы","розанчик","розарий","розариум","розбить","розвальни","розвязь","розга","розгачи","розги","розговенье","розговины","роздых","розенкрейцер","розеола","розетка","розетта","розжиг","розлив","розмарин","розмысл","розница","рознь","розоватость","розовое","розовость","розовые","розоцветные","розочка","розыгрыш","розыск","рой","ройба","ройка","рок","рокада","рокайль","рокамболь","рокер","рокировка","рок-музыка","рок-н-ролл","рококо","рокот","рокотание","рокфор","рол","ролик","ролики","роликобежец","роликоподшипник","ролл","роллер","роль","рольганг","ролька","рольмопс","рольная","рольня","рольщик","ром","роман","романеска","романея","романизация","романизирование","романизм","романист","романистика","романистка","романовка","романс","романсик","романсист","романтизация","романтизм","романтик","романтика","романтичка","романтичность","романчик","ромашка","ромб","ромбоид","ромбоэдр","ромец","ромок","ромша","ромштекс","рондо","ронжа","ропак","ропот","ропотливость","роптание","роса","росинант","росинка","росиночка","росичка","роскошество","роскошник","роскошность","роскошь","рослость","росограф","росомаха","роспись","росплывь","роспуск","роспуски","росс","россиянин","россиянка","россказни","росстань","росстанье","россыпи","россыпь","рост","ростбиф","ростверк","ростепель","ростки","ростовщик","ростовщица","ростовщичество","росток","ростомер","росточек","ростр","ростра","ростры","росчерк","росчисть","росшивь","росянка","росянковые","рот","рота","ротанг","ротапринт","ротатор","ротацизм","ротационка","ротация","ротвейлер","ротик","ротишко","ротище","ротмистр","ротмистрша","ротный","ротозей","ротозейка","ротозейничание","ротозейство","роток","ротонда","ротор","роточек","роульс","рохля","роща","рощица","роялизм","роялино","роялист","роялистка","роялишка","рояль","ртишко","ртище","ртуть","рубака","рубанок","рубаночек","рубаха","рубаха-парень","рубашечка","рубашка","рубашка-парень","рубашонка","рубашоночка","рубеж","рубеллит","рубель","рубероид","рубец","рубидий","рубило","рубильник","рубильщик","рубин","рубинчик","рубище","рубка","рублёвая","рублёвик","рублёвка","рублик","рублишко","рубль","рубрика","рубрикация","рубцевание","рубчатость","рубчик","рубщик","рубщица","руга","ругание","ругань","ругатель","ругательница","ругательство","ругня","руготня","руда","рудбекия","рудимент","рудник","рудники","рудовоз","рудознатец","рудоискатель","рудокоп","рудокопня","рудомёт","рудоносность","рудоспуск","рудоуправление","рудяк","ружейник","ружьё","ружьецо","ружьишко","руина","руины","рука","рукав","рукавица","рукавичка","рукавичник","рукавчик","руки","рукобитие","рукобитчик","рукоблудие","руководитель","руководительница","руководительство","руководство","рукодел","рукоделец","рукоделие","рукодельник","рукодельница","рукожатие","рукокрылые","рукомойка","рукомойник","рукопашная","рукопашный","рукописание","рукопись","рукоплескание","рукоплескания","рукопожатие","рукоположение","рукоприкладство","рукоприкладчик","рукоятка","рукоятчик","рукоятчица","рукоять","рулада","рулевой","рулёжка","рулёна","руление","рулет","рулетка","рулеточка","рулон","рулончик","руль","румб","румба","румпель","румын","румынка","румынки","румыны","румяна","румяная","румянение","румянец","румянка","румяность","румянчик","румяный","руна","рунд","рундук","рундучок","руно","руны","рупия","рупор","русак","Русалии","русалка","русалочка","русачка","русачок","русизм","русин","русинка","русины","русист","русистика","русицизм","руслень","русло","русопёт","русофил","русофильство","русофоб","русофобия","русофобство","русс","русская","русские","русский","руссоизм","руссоист","руст","рустика","рустовка","Русь","русь","рута","руте","рутений","рутёрка","рутил","рутина","рутинёр","рутинёрка","рутинёрство","рутинизм","рутинист","рутинистка","рутинность","рутовые","рухлядишка","рухлядь","рухляк","ручательство","ручеёк","ручей","рученька","ручища","ручка","ручки","ручник","ручница","ручонка","рушение","рушитель","рцы","рыба","Рыба","рыбак","рыбалка","рыбарь","рыбачение","рыбачество","рыбачка","рыбец","рыбёшка","рыбина","рыбинка","рыбица","рыбища","рыбка","рыбник","рыбница","рыбное","рыбовод","рыбоводство","рыбозавод","рыбокомбинат","рыболов","рыболовство","рыбонька","рыбоподъём","рыбоподъёмник","рыбопродукт","рыбопродукты","рыбопромышленник","рыботорговец","рыботорговля","рыбоход","рыбчонка","Рыбы","рыбы","рывок","рыгание","рыдалец","рыдание","рыдван","рыжак","рыжеватость","рыженький","рыжесть","рыжеусый","рыжий","рыжик","рыжина","рыжичек","рык","рыкание","рыло","рыльце","рым","рында","рынок","рысак","рысачок","рысёнок","рысистость","рысиха","рыскало","рыскание","рыскливость","рыскун","рысца","рысь","рытвина","рытвинка","рытьё","рыхление","рыхлитель","рыхловатость","рыхлокустовые","рыхлость","рыхляк","рыцарство","рыцарь","рычаг","рычажок","рычание","рьяность","рэкет","рэкетир","рэкетирство","рюкзак","рюмашка","рюмка","рюмочка","рюха","рюхи","рюш","рюшка","рябая","рябец","рябизна","рябик","рябина","рябинка","рябинник","рябиновая","рябиновка","рябиновочка","рябинушка","рябки","рябкование","рябоватость","рябой","рябок","рябость","рябуха","рябчик","рябь","рявкание","ряд","ряда","рядная","ряднина","рядно","рядович","рядовой","рядок","рядочек","рядской","рядчик","ряды","ряж","ряженая","ряжение","ряженка","ряженый","ряпушка","ряса","ряска","рясковые","рясна","рясник","рясофор","рясофорный","рясофорство","саадак","сааз","саам","саами","саамка","саамы","саба","сабайон","сабан","сабантуй","сабеи","сабей","сабеизм","сабейка","сабелька","сабельник","сабельщик","сабза","сабины","сабли","сабля","сабо","саботаж","саботажник","саботажница","саботажничество","саботирование","сабур","саван","саванна","саванны","савояр","саврас","саврасая","савраска","саврасый","сага","сагайдак","сагиб","сагиттальная","саго","саговник","саговники","саговниковые","саговые","сад","саддукеи","саддукей","саддукеянка","садизм","садик","садилка","садист","садистка","садище","садно","садовладелец","садовник","садовница","садовничество","садовод","садоводство","садок","садоразведение","садостроительство","садочек","садчик","садчица","саёк","саепёк","саечка","саечник","саечница","сажа","сажалка","сажальщик","сажальщица","сажание","саженец","саженка","сажёнка","сажёнки","сажень","саз","сазан","сазанадари","сазандар","сазанина","саиб","сайга","сайгак","сайда","сайдак","сайка","сайра","сак","саква","саквояж","саквояжик","саккос","сакля","сакман","сакманщик","сакманщица","сакраментальность","сакс","саксаул","саксаульник","саксонец","саксонка","саксонцы","саксофон","саксофонист","саксы","сакура","салазки","салака","салакушка","саламандра","саламандровые","саламандры","саламата","салат","салатик","салатник","салатница","салинг","салицилка","салки","салма","сало","саловар","саловарение","салол","салолин","саломас","салон","салонность","салончик","салоп","салопик","салопишко","салопчик","салотоп","салотопка","салотопление","салотопная","салотопня","салотопщик","салфетка","салфеточка","сальварсан","сальдо","сальмонелла","сальмонеллёз","сальник","сальности","сальность","сальто","сальто-мортале","сальтоморталист","сальце","салют","салютация","салютирование","салютование","салютовка","салями","сам","сама","саман","саманка","саманник","саманщик","саманщица","самарий","самаритяне","самаритянин","самаритянка","самба","самбист","самбистка","самбо","самбук","самбука","самец","самка","саммит","самнит","самнитка","самниты","самоанализ","самобичевание","самобранка","самобытник","самобытность","самовар","самоваришко","самоварище","самоварник","самоварчик","самоварщик","самоварщица","самовзрывание","самовидец","самовластец","самовластие","самовластитель","самовластительство","самовластник","самовластность","самовлюблённость","самовнушение","самовозбуждение","самовозвеличение","самовозвеличивание","самовозгораемость","самовозгорание","самоволие","самовольник","самовольница","самовольничание","самовольство","самовольщина","самовоспитание","самовоспламенение","самовосхваление","самовяз","самогипноз","самогон","самогонка","самогоноварение","самогонокурение","самогоночка","самогончик","самогонщик","самогонщица","самогрызение","самогуды","самодвижение","самоделка","самодельщина","самодержавец","самодержавие","самодержавность","самодержавство","самодержец","самодержица","самодеятельность","самодийцы","самодисциплина","самодовольствие","самодовольство","самодур","самодурка","самодурство","самоед","самоедка","самоедство","самоеды","самозабвение","самозабвенность","самозаготовка","самозажигание","самозакаливание","самозакалка","самозаклание","самозарождение","самозащита","самозащищение","самозванец","самозванка","самозванство","самоизнурение","самоиндукция","самоисключение","самоиспытание","самоистребление","самоистязание","самокал","самокалка","самокат","самокатка","самокатчик","самоконтроль","самокопание","самокритика","самокритичность","самокрутка","самолёт","самолётик","самолётовождение","самолёто-вылет","самолётостроение","самоличность","самолов","самоловка","самолюб","самолюбец","самолюбие","самолюбка","самолюбование","самолюбьице","самолюбьишко","самомнение","самонаблюдение","самонавалка","самонаведение","самонагревание","самонадеянность","самоназвание","самонаклад","самонакладчик","самонаслаждение","самонрав","самонравец","самообвинение","самообладание","самообличение","самообложение","самообман","самообогащение","самообожание","самообольщение","самооборона","самообразование","самообслуживание","самообучение","самоограничение","самоокапывание","самоокисление","самоокупаемость","самооплевание","самооплодотворение","самооправдание","самоопределение","самоопыление","самоопылитель","самоосадка","самоосвобождение","самоосуждение","самоотвержение","самоотверженность","самоотвод","самоотравление","самоотречение","самоотрешение","самоотрешённость","самоотрицание","самоотчёт","самоохрана","самооценка","самоочищение","самоощущение","самопал","самопальник","самописец","самописка","самоповторение","самоподаватель","самоподготовка","самопожертвование","самопознание","самопоклонение","самопомощь","самопрезрение","самопресс","самопринуждение","самопроверка","самопроизвольность","самопрославление","самопрялка","самопрялочник","самопуск","саморазвитие","саморазгрузчик","саморазложение","саморазоблачение","саморазрушение","самораспад","саморасчёт","саморегулирование","самореклама","саморекламирование","самородок","самосад","самосадка","самосброска","самосвал","самосев","самосевка","самосей","самосейка","самоскидка","самосмазка","самоснабжаемость","самоснабжение","самосовершенствование","самосогревание","самосожженец","самосожжение","самосожигатель","самосозерцание","самосознание","самосохранение","самосплав","самостийник","самостийность","самостил","самостоятельность","самостраховка","самострел","самость","самосуд","самосудство","самотаска","самотёк","самоточка","самоубийство","самоубийца","самоуважение","самоуверенность","самоуглубление","самоуглублённость","самоудовлетворение","самоудовлетворённость","самоумаление","самоунижение","самоуничижение","самоуничтожение","самоуправец","самоуправление","самоуправство","самоуправщик","самоуслаждение","самоусовершенствование","самоуспокоение","самоуспокоенность","самоустранение","самоутверждение","самоутешение","самоучитель","самоучка","самохвал","самохвалка","самохвальство","самоход","самоходка","самоходность","самохранение","самоцвет","самоцель","самочинец","самочинность","самочинство","самочка","самочувствие","самум","самурай","самшит","сан","санаторий","санация","санбат","санврач","сангвин","сангвина","сангвинизм","сангвиник","сангвиничка","сангина","сандал","сандалета","сандалеты","сандалии","сандалия","сандаловые","сандарак","сандвич","санджак","сандрик","сандружина","сандружинник","сандружинница","сандхи","сани","санинструктор","санирование","санитар","санитария","санитарка","санишки","санищи","санки","санкционирование","санкция","санкюлот","санник","сановитая","сановитость","сановитый","сановник","сановница","сановничество","сановность","саночки","саночник","санпропускник","санпросвет","санскрит","санскритолог","санскритология","сантехника","сантиграмм","сантим","сантименты","сантиметр","сантонин","санузел","сап","сапа","сапажу","сапатая","сапатый","сапёр","саперави","сапетка","сапка","сапная","сапной","сапог","сапоги","сапожишка","сапожишки","сапожишко","сапожище","сапожищи","сапожник","сапожница","сапожничание","сапожничек","сапожничество","сапожничиха","сапожок","сапожонки","сапожонок","сапонин","сапонит","сапропелит","сапропель","сапрофаг","сапрофит","сапсан","сапун","сапфир","сарабанда","сарай","сарайчик","сараишко","сараище","сарана","саранка","саранча","саранчовые","саранчук","саратовка","сарафан","сарафанишко","сарафанница","сарафанчик","сарацин","сарацинка","сарацины","сараюшко","сарган","саргассы","сард","сардар","сардель","сарделька","сардина","сардинка","сардины","сардоникс","саржа","сари","сарказм","саркастичность","сарколемма","саркома","саркоплазма","саркофаг","сарлык","сармат","сарматка","сарматы","сарпинка","сарпиночник","сарпиночница","сарсапарель","сарсуэла","сарыч","сарыча","сассапарель","сатана","Сатана","сатанёнок","сатанизм","сатанинство","сателлит","сатин","сатинёр","сатинет","сатинирование","сатинировка","сатир","сатира","сатириаз","сатириазис","сатирик","сатиричность","сатисфакция","сатрап","сатрапия","сатуратор","сатурация","Сатурн","сатурналии","сатурнизм","сатурнии","сауна","сафари","сафлор","сафранин","сафьян","сахар","сахара","сахарец","сахаризация","сахариметр","сахариметрия","сахарин","сахаринка","сахаристость","сахар-медович","сахарник","сахарница","сахаровар","сахароварение","сахароварня","сахароварство","сахароза","сахарозавод","сахарозаводчик","сахарозаводчица","сахарок","сахарометр","сахарометрия","сахаронос","сахар-сатурн","сахары","сачок","саше","саян","сбавка","сбалансирование","сбег","сбегание","сберегание","сбережение","сбережения","сберкасса","сберкнижка","сбивалка","сбивание","сбивка","сбивчивость","сбир","сбиратель","сбитенная","сбитенщик","сбитенщица","сбитень","сближение","сближенность","сбой","сбойка","сбоина","сболчивание","сбор","сбора","сборище","сборка","сборки","сборная","сборник","сборничек","сборное","сборность","сборочка","сборочная","сборочный","сборщик","сборщица","сборы","сбраживание","сбрасывание","сбрасыватель","сбривание","сброд","сброс","сброска","сбруечка","сбруйка","сбруйник","сбруйница","сбруишка","сбруйщик","сбруя","сбрызг","сбрызгивание","сбыв","сбывание","сбыт","сбытие","сбытовик","сбыточность","сбытчик","свадебка","свадьба","сваебоец","сваебой","сваечка","свайка","свайник","свайщик","свал","сваливание","свалка","свальщик","свальщица","сван","сванка","сваны","свара","сварение","свариваемость","сваривание","сварка","сварливец","сварливица","сварливость","сварщик","сварщица","свастика","сват","сватание","сватик","сватовство","сваток","сваточек","сватушка","сватьюшка","сватья","сваха","свахонька","свашенька","свашка","свая","свевание","сведение","сведения","свежак","свежатина","свежачок","свежевальщик","свежевальщица","свежевание","свеженина","свеженинка","свежесть","свежина","свежинка","свежьё","свёкла","свекловица","свекловичница","свекловище","свекловод","свекловодство","свеклокомбайн","свеклокопатель","свекломойка","свеклоподъёмник","свеклорезка","свеклосеяние","свеклоуборка","свеклоутомление","свекольник","свёкор","свекровка","свекровушка","свекровь","свекруха","свербёж","свержение","сверка","сверкание","сверление","сверлилка","сверлилы","сверлильщик","сверлильщица","сверлина","сверло","сверловщик","сверловщица","свёрстка","сверстник","сверстница","сверстничек","сверстничество","свёрстывание","свёртка","свёрток","свёрточек","свёртываемость","свёртывание","сверхбаллон","сверхгалактика","сверхгигант","сверхкомплект","сверхприбыль","сверхсенсация","сверхсрочная","сверхсрочник","сверхсрочнослужащий","сверхтекучесть","сверхурочная","сверхурочные","сверхчеловек","сверхчеловеческое","сверхчувственное","сверхъестественное","сверхъестественность","сверчковые","сверчок","свершение","свершения","свершитель","сверщик","сверщица","свес","свет","светание","светёлка","светёлочка","светец","светик","светило","светильник","светильня","светимость","светлейшая","светлейший","светлица","светличка","светловатость","светлость","светлота","светлынь","светляк","светлячок","светобоязнь","светозарность","светокопирование","светокопировка","светокопия","светокультура","светолечебница","светолечение","светолюб","светолюбивость","светолюбие","светомаскировка","светометрия","светомузыка","светонепроницаемость","светоносность","светоотдача","светопись","светопреломление","светопреставление","светопроницаемость","светорассеяние","светосигнал","светосигнализация","светосигнальщик","светосила","светосостав","светостойкость","светотень","светотехник","светотехника","светофильтр","светофор","светоч","светочувствительность","светский","светскость","свеча","свечение","свеченька","свечечка","свечка","свечник","свешивание","свивальник","свивание","свивка","свидание","свиданьице","свидетель","свидетельница","свидетельская","свидетельство","свидетельствование","свилеватость","свиль","свинарка","свинарник","свинарня","свинарь","свинёнок","свинец","свинина","свининка","свинка","свинобоец","свинобой","свиновод","свиноводство","свинокопчёности","свиноматка","свинооткорм","свинопас","свинорой","свиносовхоз","свиноферма","свинство","свинтус","свинуха","свинушка","свинушник","свинцевание","свинцовость","свинчак","свинчатка","свинчивание","свинья","свинюшник","свирелка","свирель","свирельщик","свирельщица","свирепость","свирепство","свиристелка","свиристель","свиристение","свисание","свислость","свист","свистание","свистелка","свистение","свисток","свистопляс","свистопляска","свисточек","свистулька","свистун","свистунок","свистунья","свита","свитер","свитка","свиток","свиточек","свиточка","свитский","свих","свихивание","свищ","свищик","свияга","свиязь","свобода","свободная","свободнорождённая","свободнорождённый","свободный","свободолюбец","свободолюбие","свободомыслие","свободушка","свод","сводик","сводка","сводник","сводница","сводничание","сводничество","сводня","сводочка","сводчик","своё","своебытность","своевластие","своеволец","своеволие","своевольная","своевольник","своевольница","своевольничание","своевольность","своевольный","своевольство","своевольщина","своевременность","своедельщина","своеземец","своекорыстие","своекорыстное","своелюбие","своенародность","своенравие","своенравность","своеобразие","своеобразность","своеобычие","своеобычливость","своеобычность","своз","свозка","свои","свой","свойлачивание","свойственник","свойственница","свойственность","свойство","сволакивание","сволок","сволота","сволочьё","свора","сворачивание","сворка","своя","свояк","свояченица","своячина","своячок","свыкание","связа","связанность","связи","связист","связистка","связишка","связка","связная","связник","связной","связность","связочка","связывание","связь","свясло","святая","святейшество","святилище","святитель","святительство","Святки","святой","святокупец","святокупство","святость","святотатец","святотатство","святочник","Святочность","святоша","святошество","Святцы","святые","святыня","священник","священнодействие","священнослужение","священнослужитель","священство","сгад","сгиб","сгибание","сгибатель","сглаженность","сглаживание","сглаз","сгнивание","сговор","сговорёнка","сговорённость","сговорчивость","сгон","сгонка","сгонщик","сгораемость","сгорание","сгорбленность","сгребание","сгрузка","сгуститель","сгусток","сгущаемость","сгущение","сгущёнка","сгущённость","сдабривание","сдавание","сдавленность","сдавливание","сдаточные","сдаточный","сдатчик","сдатчица","сдача","сдваивание","сдвиг","сдвигание","сдвижение","сдвижка","сдвоение","сдвоенность","сдвойка","сделка","сдельность","сдельные","сдельщик","сдельщина","сдельщица","сдёргивание","сдержанность","сдерживание","сдирание","сдирщик","сдирщица","сдоба","сдобник","сдобничек","сдобное","сдув","сдувание","сеанс","сеансёр","себестоимость","себялюб","себялюбец","себялюбие","себялюбство","себяобожание","сев","севалка","севальщик","севба","север","Север","северные","североамериканец","североамериканка","североамериканцы","северо-восток","северо-запад","североморец","северяк","северяне","северянин","северянка","севок","севооборот","севосмен","севр","севрюга","севрюжина","севрюжка","сегидилья","сегмент","сегментация","сегодня","сегодняшнее","сеголетка","сеголетки","сеголеток","сегрегация","седалище","седало","седёлка","седельник","седельце","седельщик","седина","сединка","седины","седлание","седло","седловина","седловинка","седловка","сёдлышко","седмина","седмица","седок","седочок","седьмая","седьмой","сеево","сежа","сезам","сезень","сезон","сезонник","сезонница","сезонность","сей","сеид","сейид","сейм","сейнер","сейсмичность","сейсмогеология","сейсмограмма","сейсмограф","сейсмография","сейсмолог","сейсмология","сейсмометр","сейсмометрия","сейсмоскоп","сейсмостойкость","сейф","сейша","секанс","секатор","секач","секвенция","секвестр","секвестрация","секвестрирование","секвестрование","секвойя","секира","секрет","секретарёк","секретариат","секретаришка","секретарская","секретарство","секретарша","секретарь","секретер","секретец","секретин","секретка","секретная","секретник","секретница","секретничание","секретность","секреция","секс","сексапильность","секс-бомба","сексолог","сексология","сексопатолог","сексопатология","секста","секстаккорд","секстант","секстет","секстиллион","секстильон","секстина","сексуальность","секта","сектант","сектантка","сектантство","сектатор","сектаторство","сектор","секуляризация","секунда","секундант","секундатор","секунд-майор","секундомер","секундометрист","секундочка","секутор","секуция","секущая","секционер","секционерка","секционная","секция","секьюрити","селадон","селадонство","селёдка","селёдочка","селёдочник","селёдочница","селезёнка","селезёночник","селезень","селективность","селектор","селекционер","селекция","селен","Селена","селенга","селение","селенит","селенография","селеньице","селин","селитра","селитровар","селитроварение","селитроварка","селитроварня","селитрообразование","селитряница","селитьба","селишко","селище","село","сель","сельва","сельвас","сельвасы","сельдевые","сельдерей","сельджук","сельджуки","сельдь","селькуп","селькупка","селькупы","сельмаг","сельпо","сельтерская","сельхозартель","сельхозинвентарь","сельхозмашина","сельцо","сельчанин","сельчанка","селянин","селянка","селяночка","селянство","сема","семантика","семасиолог","семасиология","семафор","семафорщик","семафорщица","сёмга","семейка","семейная","семейность","семейные","семейный","семейские","семейственность","семейство","семема","семена","семенник","семеновед","семеноведение","семеновместилище","семеновод","семеноводство","семенодоля","семеномер","семерик","семёрка","семестр","семечки","семечко","семечковые","семеюшка","семиборье","семибоярщина","семидесятая","семидесятилетие","семидесятник","семидесятый","семидневка","семизвездие","Семик","семиклассник","семиклассница","семиколоска","семилетие","семилетка","семилеток","семилинейка","семинар","семинарий","семинарист","семинариум","семинария","семинарщина","семиотика","семиполье","семисвечник","семисотая","семисотлетие","семисотый","семит","семитизм","семитка","семитолог","семитология","семиты","семитысячная","семитысячный","семиугольник","семичасовой","семишник","семнадцатая","семнадцатилетие","семнадцатый","семпель","сёмужка","семьища","семья","семьянин","семьянинка","семьянка","семя","семявместилище","семявход","семядоля","семяед","семяизвержение","семяизлияние","семянка","семяножка","семяносец","семяпочка","семяпровод","сенат","сенатор","сенаторство","сенаторша","сенбернар","сенечки","сенешаль","сени","сенинка","сенки","сенник","сенница","сено","сеновал","сеноволокуша","сеноворошение","сеноворошилка","сеногной","сеноед","сеноеды","сеножатка","сеножать","сенозаготовка","сенокопнитель","сенокос","сенокосец","сенокосилка","сенокосцы","сенокошение","сенонагрузчик","сеноподборщик","сеноподъёмник","сеносдатчик","сенособиратель","сено-солома","сеноставец","сеноставка","сеносушилка","сеносушка","сенотаска","сеноуборка","сенофураж","сенохранилище","сенсационность","сенсация","сенсибилизатор","сенсибилизация","сен-симонизм","сен-симонист","сенситивность","сенсуализм","сенсуалист","сенсуалистка","сенсуальность","сентенциозность","сентенция","сентиментализм","сентименталист","сентиментальничание","сентиментальность","сентиментальщина","сентименты","сентябрь","сенцо","сенцы","сень","сеньор","сеньора","сеньорен-конвент","сеньорита","сеньория","сепаративность","сепаратизм","сепаратист","сепаратистка","сепаратность","сепаратор","сепараторщик","сепараторщица","сепарация","сепарирование","сепия","сепсис","септаккорд","септет","септик","септиктанк","септима","септицемия","септуор","сера","сераделла","сераль","сераскир","Серафим","серая","серб","сербалина","сербияне","сербиянин","сербиянка","сербка","сербы","серв","серваж","сервант","сервелат","сервиз","сервилизм","сервировка","сервис","сервитут","сердар","сердечишко","сердечко","сердечная","сердечник","сердечница","сердечное","сердечность","сердечный","сердитая","сердитость","сердитый","сердоболие","сердобольная","сердобольность","сердобольный","сердолик","сердолюбие","сердце","сердцебиение","сердцевед","сердцеведение","сердцеведец","сердцеведка","сердцевидец","сердцевидка","сердцевина","сердцевинка","сердцеед","сердцеедка","сердчишко","сердюк","сердяга","серебрение","серебреник","серебрец","серебрецо","серебрильщик","серебрина","серебринка","серебристость","серебро","серебрушка","серебряник","серебрянка","серебряный","середина","серединка","серединочка","серёдка","середняк","середнячество","середнячка","середнячок","середович","середокрестная","серёдочка","серёжка","серёжки","серенада","серенка","сержант","сериал","серизна","серийность","серина","серистость","серия","серка","серко","сермяга","сермяжина","сермяжка","сермяжник","серна","серник","сернистость","серница","серничек","серничок","сероватость","сероводород","сероглазая","сероглазый","серодиагностика","серое","серозём","серокафтанник","серология","серопески","серость","серотерапия","сероуглерод","серошинельник","серп","серпантин","серпентин","серпий","серпик","серповище","серпок","серпоклюв","серпуха","серпянка","серсо","сертификат","сертификация","серум","серуха","серый","серьга","серьёз","серьёзничание","серьёзное","серьёзность","серянка","серятина","сессия","сестерций","сестра","сестра-хозяйка","сестрёнка","сестрица","сестричич","сестричка","сет","сетево","сетевязание","сети","сетка","сетование","сетования","сеточка","сеточник","сеттер","сеттльмент","сетчатка","сетчатокрылые","сеть","сеунч","сеча","сечевик","сечение","сечка","сеялка","сеяльщик","сеяльщица","сеянец","сеяние","сеянка","сеятель","сжатие","сжатость","сживание","сжигание","сжижение","сжим","сжимаемость","сжимание","сжинание","сзывание","си","сиаль","сиамец","сиамка","сиамцы","сибарит","сибаритка","сибаритство","Сибилла","сибилянт","сибирец","сибирка","сибирочка","сибиряк","сибирячка","сибирячок","сивая","сивер","сиверка","сиверко","Сивилла","сивилла","сивка","Сивка-бурка","сивко","сивоворонка","сиводёр","сиводрал","сиводушка","сиволап","сиволапая","сиволапость","сиволапый","сиволдай","сиворонка","сивость","сивуха","сивуч","сивучонок","сивый","сиг","сигара","сигарета","сигаретка","сигаретчик","сигаретчица","сигарка","сигарочка","сигарочник","сигарочница","сигилляриевые","сигиллярия","сигма","сигнал","сигнализатор","сигнализация","сигналик","сигналист","сигналистка","сигнальчик","сигнальщик","сигнальщица","сигнарант","сигнарантка","сигнатура","сигнатурщик","сигнатурщица","сиговина","сиговые","сиголов","сигудок","сигуранца","сидевшая","сидевший","сидейка","сиделец","сиделка","сидение","сидень","сиденье","сидерат","сидерация","сидерит","сидериты","сидор","сидр","сидящая","сидящий","сие","сиена","сиенит","сиерра","сиеста","сижок","сизаль","сизарь","сизигии","сизигия","сизина","сизоватость","сизоворонка","сизоворонковые","сизость","сизяк","сиккатив","сикл","сикомор","сикофант","сикурс","сила","силач","силачка","силёнка","силёшка","силикальцит","силикат","силикатизация","силикатирование","силикатчик","силикаты","силикоз","силиций","силицирование","силишка","силища","силка","силки","силлиманит","силлогизм","силлогистика","силок","силомер","силон","силос","силосование","силосорезка","силосуемость","силочек","силумин","силур","силушка","силуэт","силуэтёр","силуэтик","силуэтист","силуэтистка","силуэтность","силы","силь","сильванер","сильвин","сильная","сильный","сильф","сильфида","сильфиды","сима","симбиоз","симбионт","символ","символизация","символизм","символика","символист","символистика","символистка","симка","симметричность","симметрия","симония","симпатичность","симпатия","симпатяга","симпозиум","симпомпончик","симптом","симптоматика","симптоматология","симулирование","симультанность","симулянт","симулянтка","симуляция","симфониетта","симфонизация","симфонизм","симфонист","симфония","синагога","синаксарь","синантроп","синап","синапизм","сингал","сингалез","сингалезка","сингалезы","сингалец","сингалка","сингалы","сингальцы","сингармонизм","синдесмология","синдетикон","синдик","синдикализм","синдикалист","синдикат","синдицирование","синдром","синеблузник","синева","синеватость","синедрион","синекдоха","синекура","синель","синелька","синельня","синельщик","синельщица","синема","синемаскоп","синематограф","синематографист","синение","синенькая","синенькие","синеокая","синеокий","синерама","синерод","синестрол","синец","синигрин","синильник","синица","синичка","синклиналь","синклит","синкопа","синкопирование","синкретизм","синкретичность","синовия","синод","синодик","синолог","синология","синоним","синонимика","синонимичность","синонимия","синопсис","синоптик","синоптика","синтагма","синтагматика","синтаксис","синтаксист","синтактика","синтез","синтезатор","синтезирование","синтепон","синтетизм","синтетика","синтоизм","синтоист","синтоистка","синус","синусоида","синхронизатор","синхронизация","синхронизм","синхроничность","синхрония","синхронность","синхротрон","синхрофазотрон","синхроциклотрон","синь","синьга","синька","синьор","синьора","синьорина","синьория","синюга","синюха","синюховые","синюшник","синюшность","синяк","синячок","синяя","сионизм","сионист","сионистка","сип","сипай","сипение","сипловатость","сиплость","сиповатость","сиповка","сипота","сипотца","сир","сирен","сирена","Сирена","сирены","сирень","сиренька","сириец","сирийка","сирийцы","сирин","Сириус","сирокко","сироп","сирость","сирота","сиротина","сиротинка","сиротиночка","сиротинушка","сиротка","сиротливость","сироточка","сиротство","сиртаки","сирые","система","систематизатор","систематизация","систематизирование","систематизм","систематик","систематика","систематичность","системка","систола","систр","сиська","сиськи","ситар","ситец","ситечко","ситник","ситниковые","ситничек","ситный","сито","ситовейка","ситовина","ситовник","ситро","ситуация","ситце","ситцепечатание","ситцепечатник","ситчик","сифилидолог","сифилидология","сифилиды","сифилис","сифилитик","сифилитичка","сифилома","сифон","сифонофора","сия","сияние","сиятельная","сиятельный","сиятельство","скабиоза","скабрёзность","сказ","сказание","сказанное","сказатель","сказитель","сказительница","сказка","сказочка","сказочник","сказочница","сказочность","сказуемое","сказуемость","сказывание","скакалка","скакалочка","скакание","скакун","скакунок","скакуны","скакунья","скакушка","скала","скалдырник","скалдырница","скалдырничество","скалистость","скалка","скало","скалозуб","скалозубство","скалолаз","скалолазание","скалочка","скалывание","скальд","скальп","скальпель","скальпирование","скаляр","скамеечка","скамейка","скампавея","скамья","скандал","скандалёзность","скандалец","скандалист","скандалистка","скандалище","скандальник","скандальность","скандальчик","скандий","скандинав","скандинавец","скандинавка","скандинавцы","скандинавы","скандирование","скандировка","скандование","скандовка","сканер","сканирование","скань","скапливание","скаполит","скапывание","скарабей","скарб","скарбишко","скарбник","скарбница","скарбничий","скаред","скареда","скаредник","скаредница","скаредность","скарификатор","скарификация","скарлатина","скармливание","скарн","скарпель","скат","скатёрка","скатёрочка","скатерть","скатерть-самобранка","скатка","скатол","скатывание","скатыш","скаут","скаутизм","скаутинг","скафандр","скачивание","скачка","скачки","скачкообразность","скачок","скачь","скашивание","скважина","скважинка","скважистость","скважность","сквайр","сквалыга","сквалыжник","сквалыжница","сквалыжничество","скваттер","сквашение","сквашиваемость","сквашивание","сквер","скверик","скверна","сквернавец","сквернавка","сквернослов","сквернословец","сквернословие","сквернословка","скверность","сквозняк","сквознячок","скворец","скворечник","скворечница","скворечня","скворка","скворушка","скворчиха","скворчонок","скейт","скейтборд","скелет","скелетина","скелетирование","скелетон","скена","скепсис","скепт","скептик","скептицизм","скептичность","скерда","скерцо","скетинг-ринг","скетч","скидальщик","скидка","скидочка","скидывание","скиния","скип","скипетр","скипидар","скирд","скирда","скирдник","скирдовальщик","скирдовальщица","скирдование","скирдовка","скирдовник","скирдовоз","скирдоправ","скиркание","скисание","скит","скиталец","скиталица","скитальчество","скитание","скитник","скитница","скиток","скитянин","скитянка","скиф","скифство","скифы","скиц","скицирование","склаваж","склад","складенец","складень","складирование","складка","складкообразование","складничество","складность","складочка","складство","складчатость","складчик","складчина","складчинка","складчица","складывальщик","складывальщица","складывание","склёвывание","склеивальщик","склеивальщица","склеивание","склейка","склейщик","склейщица","склеп","склёпка","склёпщик","склёпщица","склёпывание","склера","склерит","склеродерма","склеродермия","склероз","склерома","склерометр","склерометрия","склерон","склероскоп","склеротик","склеротиния","склеротичка","склеротомия","склиз","склизок","скликание","склока","склон","склонение","склонность","склоняемость","склочник","склочница","склочничество","склочность","склянка","скляночка","скнипа","скоба","скобарь","скобелка","скобель","скобка","скобки","скобление","скоблёнка","скоблилка","скоблильщик","скоблильщица","скобовщик","скобочка","скобочник","скованность","сковка","сковорода","сковородень","сковородка","сковородник","сковывание","сковыривание","скок","скол","сколачивание","сколиоз","сколка","сколок","сколопендра","сколоты","скольжение","скользкость","скользота","скользь","скомкание","скомканность","скомкивание","скоморох","скоморошество","скоморошничество","сконфуженность","скончание","скоп","скопа","скопец","скопидом","скопидомка","скопидомство","скопище","скопление","скопцы","скопчество","скопчиха","скопщина","скора","скорбность","скорбут","скорбь","скорлупа","скорлупка","скорлупочка","скорм","скорняжная","скорняжничание","скорняжничество","скорняк","скорнячка","скоробогатей","скороварка","скороговорка","скороговорочка","скоромник","скоромница","скоромное","скороморозилка","скоропалительность","скоропашка","скорописание","скорописец","скоропись","скороплодность","скороподъёмник","скороподъёмность","скоропостижность","скоропроходчик","скороспелка","скороспелость","скоростемер","скоростник","скоростница","скорострелка","скорострельность","скорость","скоросшиватель","скоротечность","скорохват","скороход","скороходь","скорпена","Скорпион","скорпион","скорпия","скорцонера","скорый","скос","скосок","скосырь","скот","скотина","скотинка","скотинник","скотинушка","скотная","скотник","скотница","скотный","скотобоец","скотобойня","скотовод","скотоводство","скотогон","скотоложец","скотоложство","скотома","скотомогильник","скотоподобие","скотопрогон","скотопромышленник","скотопромышленность","скотосырьё","скототорговец","скотское","скотство","скотч","скошёвка","скрадывание","скрап","скрашивание","скребень","скрёбка","скребло","скребница","скребок","скрежет","скрежетание","скреп","скрепа","скрепер","скреперист","скреперистка","скрепка","скрепки","скрепление","скрещение","скрещиваемость","скрещивание","скрижали","скрижаль","скрижапель","скрип","скрипач","скрипачка","скрипение","скрипица","скрипка","скрипочка","скрипун","скромник","скромница","скромничание","скромность","скруббер","скругление","скрупул","скрупулёзность","скрутка","скрутчик","скрутчица","скручивание","скрывание","скрыня","скрытие","скрытник","скрытница","скрытничество","скрытность","скрябка","скряга","скряжничество","скудель","скудельница","скуди","скудность","скудо","скудомыслие","скудость","скудоумие","скука","скукота","скула","скуластость","скулёж","скуление","скулы","скульптор","скульпторша","скульптура","скульптурность","скумбриевые","скумбрия","скумпия","скунс","скупердяй","скупердяйка","скупец","скупка","скупой","скупость","скупщик","Скупщина","скупщица","скусывание","скутер","скутерист","скутеристка","скуфеечка","скуфейка","скуфья","скученность","скучища","скучливость","скучноватость","слабая","слабина","слабительное","слабоволие","слабоголосость","слабогрудость","слабодушие","слабомыслие","слабонервность","слабосилие","слабосильная","слабосильный","слабость","слаботочник","слабоумие","слабохарактерность","слабый","слава","славильщик","славист","славистика","славистка","славка","славки","славление","славолюбие","славословие","славословящий","славяне","славянизация","славянизм","славянин","славянист","славянка","славяновед","славяноведение","славянолюб","славянолюбец","славянолюбие","славянофил","славянофилка","славянофильство","славянофильствование","славянофоб","славянофобка","славянофобство","славянофобствование","славянство","славянщизна","славянщина","слагаемое","слагатель","слагательница","слад","сладковатость","сладкогласие","сладкое","сладкоежка","сладкозвучие","сладкозвучность","сладкопевец","сладкопевность","сладкопение","сладкоречие","сладости","сладостность","сладострастие","сладострастник","сладострастница","сладострастность","сладость","слаженность","слайд","слаксы","слалом","слаломист","слаломистка","сламывание","сланец","сланцеватость","слань","сластёна","сластёны","сласти","сластоежка","сластолюбец","сластолюбие","сласть","слащавость","слега","след","слединг","следование","следователь","следовательша","следок","следопыт","следопытство","следочек","следствие","следующая","следующее","следующий","слёживание","слежка","слеза","слезание","слезинка","слезиночка","слёзка","слезливость","слезник","слезница","слёзное","слезоотделение","слезотечение","слезоточивость","слёзы","сленг","слепая","слепень","слепец","слепливание","слеповатость","слепой","слепок","слепота","слепун","слепушонка","слепушонок","слепыш","слесарёнок","слесаришка","слесарная","слесарничество","слесарня","слесарство","слесарша","слесарь","слёт","слётанность","слёток","слив","слива","сливание","сливка","сливки","сливкоотделитель","сливняк","сливовица","сливовые","сливочки","сливочник","сливщик","сливщица","сливянка","слизевик","слизень","слизетечение","слизистая","слизняк","слизывание","слизь","слип","слипание","слитие","слитность","слиток","сличение","слияние","слиянность","слобода","слободка","слободчанин","слободчанка","слобожанин","слобожанка","слова","словак","словаки","словарик","словарник","словарь","словачка","словенец","словенка","словенцы","словесник","словесница","словесность","словечко","словечушко","словинец","словинка","словинцы","словник","слово","словоблуд","словоблудие","словобоязнь","словоговорение","словоизвержение","словоизлияние","словоизменение","словолитня","словолитчик","словообилие","словообразование","словоохотливость","словоохотность","словопрение","словопроизведение","словопроизводство","словосложение","словосочетание","словосочинение","словотворчество","словотолкование","словоупотребление","словцо","слог","слогораздел","слоевище","слоение","слоечка","сложение","сложности","сложность","сложноцветные","слой","слойка","слоистость","слом","сломка","слон","слонёнок","слоник","слониха","слоновник","слоновость","слоновщик","слопец","слуга","слуда","служака","служанка","служаночка","служащая","служащий","служба","службист","службы","служебник","служебность","служение","служивенький","служивый","служилый","служитель","служительница","служка","слука","слух","слухач","слухи","случай","случайное","случайность","случившееся","случка","слушание","слушатель","слушательница","слушающая","слушающий","слушок","слых","слышанное","слышимое","слышимость","слюда","слюдинит","слюна","слюни","слюнка","слюнки","слюногон","слюноотделение","слюнотечение","слюнтяй","слюнтяйка","слюнтяйство","слюнявец","слюнявка","слюнявость","слюнявчик","сляб","слябинг","слякоть","смазка","смазливость","смазчик","смазчица","смазывание","смазь","смак","смакование","смалец","смальта","сманивание","смарагд","смарывание","сматывание","смахивание","смачиваемость","смачивание","смачиватель","смачность","смежник","смежность","смекалистость","смекалка","смелая","смелость","смелый","смельчак","смена","сменность","сменщик","сменщица","сменяемость","смерд","смердение","смердяковщина","смерзание","смертельность","смертная","смертник","смертное","смертность","смертный","смертоносность","смертоубийство","смерточка","смертушка","смертынька","смерть","смерч","смерщик","смерщица","смесеобразование","смеситель","смеска","смесь","смета","сметана","сметание","сметанка","сметанник","смётка","сметливость","сметчик","смётывание","смех","смехотвор","смехотворность","смехотворство","смехун","смехунья","смешанность","смешение","смешиваемость","смешивание","смешинка","смешки","смешливость","смешное","смешок","смещаемость","смещение","смилакс","сминаемость","сминание","смирёна","смирение","смиренник","смиренница","смиренномудрие","смиренность","смиренство","смиритель","смирна","смирность","смог","смоква","смокинг","смоковница","смола","смолачивание","смолеватость","смолёвка","смоление","смолильщик","смолильщица","смолистость","смолка","смолкание","смоловар","смоловарня","смологон","смологонщик","смолокур","смолокурение","смолокурня","смолосеменник","смолосемянник","смолотечение","смолы","смоль","смольё","смольня","смольняк","смольнянка","смольщик","смолянка","сморкание","сморкач","сморкун","сморода","смородина","смородинка","смородинник","смородиновка","сморчковые","сморчок","сморщивание","смотка","смотр","смотрельщик","смотрение","смотрильня","смотрины","смотритель","смотрительница","смотрительство","смотрительша","смотчик","смотчица","смрад","смрадность","смугловатость","смуглость","смуглота","смугляк","смуглянка","смурыгание","смута","смутитель","смутительница","смутка","смутник","смутница","смутность","смуток","смуть","смутьян","смутьянка","смутьянство","смушек","смушка","смущение","смущённость","смывание","смывка","смывки","смывщик","смывщица","смык","смыкание","смыливание","смылки","смысл","смычка","смычковые","смычный","смычок","смышлённость","смягчение","смягчённость","смягчитель","смятение","смятенность","смятие","смятость","снабженец","снабжение","снадобье","снадобьице","снадобья","снайпер","снайперство","снайпинг","снаряд","снаряжение","снасточка","снасть","снашивание","снег","снегирёк","снегирёнок","снегириха","снегирь","снеговал","снегование","снегоед","снегозадержание","снегозащита","снеголом","снегомер","снегоочиститель","снегопад","снегопах","снегопахание","снегопогрузчик","снеготаялка","снеготаяние","снегоуборка","снегоуборщик","снегоход","снегурки","Снегурочка","снегурочки","снедение","снедь","снежина","снежинка","снежище","снежки","снежник","снежница","снежноягодник","снежок","снежочек","снежура","снет","снеток","снеточек","снижение","снизка","снизывание","снимание","снимок","снимочек","снискание","снисходительность","снисхождение","сноб","снобизм","сновальщик","сновальщица","снование","сновидение","сновидец","сновидица","сновка","сногсшибательность","сноп","снопик","снопище","сноповка","сноповязалка","сноповязальщик","сноповязальщица","снопок","снопоподаватель","снопоподъёмник","снопосушилка","снопочек","сноровистость","сноровка","сноровочка","снос","сноска","сносливость","снотворное","снотолкователь","снотолковательница","сноха","снохарь","снохач","снохачество","сношение","сношения","сношенька","снытка","сныть","снятие","соавтор","соавторство","соаренда","соарендатор","собака","собаки","собаковедение","собаковод","собаководство","собакоголовые","собачар","собачатник","собачей","собаченька","собачина","собачища","собачка","собачки","собачник","собачница","собачня","собачонка","собачонок","собачьи","собеседник","собеседница","собеседничество","собеседование","собина","собинка","собирание","собиратель","собирательница","собирательность","собирательство","собкор","соблаговоление","соблазн","соблазнитель","соблазнительница","соблазнительность","соблюдение","соболевание","соболёвка","соболевод","соболеводство","соболёвщик","соболезнование","соболезнователь","соболёк","соболёнок","соболь","соболюшка","соболятник","собор","соборище","соборность","соборование","соборянин","собравшиеся","собрание","собранное","собранность","собраньице","собрат","собратство","собственник","собственница","собственность","собутыльник","собутыльничество","событие","событийность","события","событьице","сова","совёнок","соверен","совершение","совершенное","совершённое","совершеннолетие","совершеннолетний","совершеннолетняя","совершенства","совершенство","совершенствование","совершитель","совершительница","совестливость","совесть","совет","советник","советница","советование","советодатель","советодательница","советчик","советчица","совещание","совещатель","совещательница","совик","совиновник","совиновность","совка","совладание","совладелец","совладелица","совладение","совлечение","совместимость","совместитель","совместительница","совместительство","совместник","совместница","совместничество","совместность","совмещение","совок","совокупление","совокупность","совоспитанник","совоспитанница","совочек","совпадение","совратитель","совратительница","совращение","современник","современница","современность","совхоз","совы","согбение","согдиец","согдийка","согдийцы","согды","соглас","согласие","согласник","согласница","согласность","согласный","согласование","согласованность","соглашатель","соглашательство","соглашение","соглядатай","соглядатайство","согра","согражданин","согражданка","согрев","согревание","согрешение","сода","содалит","содействие","содейство","содержание","содержанка","содержатель","содержательность","содержимое","содоклад","содокладчик","содом","содрогание","содружество","соединение","соединимость","соединитель","сожаление","сожжение","сожитель","сожительница","сожительство","сожитие","созвездие","созвучие","созвучность","создавание","создание","Создатель","создатель","создательница","созерцание","созерцатель","созерцательница","созерцательность","созидание","созидатель","созидательница","сознание","сознательная","сознательность","сознательный","созревание","созыв","соизволение","соиздатель","соизмерение","соизмеримость","сойка","сойма","соименник","соименница","сойот","сойотка","сойоты","соискание","соискатель","соискательница","соискательство","соитие","сок","сокамерник","сокамерница","соквартирант","соквартирантка","соки","сокирки","соклассник","соклассница","соковар","соковарка","соковыжималка","соковыжиматель","сокодвижение","сокол","соколёна","соколёнок","соколик","соколиные","соколиха","соколица","соколок","сокольник","сокольничий","сокоотжималка","сократимость","сократительность","сокращение","сокращённость","сокредитор","сокровенное","сокровенность","сокровища","сокровище","сокровищница","сокруха","сокрушение","сокрушитель","сокрушительность","сокрытие","сокурсник","сокурсница","соланин","солдат","солдатик","солдатишка","солдатище","солдатка","солдатня","солдатство","солдатушка","солдатчина","солдатьё","солдафон","солдафонство","солевар","солеварение","солеварная","солеварница","солеварня","солевоз","солевыносливость","соледобывание","солеломня","солемер","соление","солёное","соленоид","солёности","солёность","соленья","солепромышленник","солепромышленность","солеразработки","солерастворитель","солерод","солерос","солесодержание","солесос","солестойкость","солецизм","солея","солидаризация","солидарность","солидность","солидол","солило","солильня","солильщик","солильщица","солипсизм","солипсист","солист","солистка","солитер","солитёр","солка","соллюкс","солнечник","солнечность","солноворот","солновосход","солновсход","солнозакат","солнопёк","солнце","Солнце","солнцеворот","солнцевосход","солнцезакат","солнцелечение","солнцепёк","солнцестояние","солнышко","соло","соловая","соловей","соловейко","соловейчик","соловеюшка","соловка","соловушек","соловушка","соловый","соловьиха","солод","солодильня","солодильщик","солодильщица","солодка","солодовня","солододробилка","солодоращение","солодосушилка","солодь","соложение","соло-клоун","солома","соломенник","соломина","соломинка","соломистость","соломит","соломка","соломоволокуша","соломокопнильщик","соломокопнитель","соломорезка","соломотряс","солонгой","солонец","солонина","солонинка","солоница","солонка","солоноватость","солонцеватость","солончак","соль","сольдо","сольфеджио","сольфеджирование","сольфеджо","сольца","солянка","соляр","соляризация","солярий","солярка","сом","сома","сомали","сомалиец","сомалийка","сомалийцы","соматология","сомбреро","сомёнок","сомик","сомина","сомкнутость","сомнамбул","сомнамбула","сомнамбулизм","сомнамбулка","сомнение","сомнительность","сомножитель","сомовина","сомовые","сомы","сомье","сомятина","сон","сонаниматель","сонант","сонаследник","сонаследница","сонаследование","соната","сонатина","сонатка","сонатность","сонет","сонетка","сони","сонливец","сонливица","сонливость","сонм","сонмище","сонник","сонность","сонорный","сонуля","сонь","соня","соображение","соображения","сообразительность","сообразность","сообщение","сообщество","сообщительность","сообщник","сообщница","сообщничество","сооружение","сооруженьице","соосность","соответственность","соответствие","соответчик","соответчица","соотечественник","соотечественница","соотнесение","соотнесённость","соотносительность","соотношение","соотчич","сопа","сопатка","сопелка","сопелочка","сопель","сопельник","сопельщик","сопение","сопереживание","соперник","соперница","соперничество","сопилка","сопилочка","сопка","соплеменник","соплеменница","сопли","сопливая","сопливец","сопливица","сопливость","сопливый","сопло","соплодие","сопля","сопляк","соплячка","соподчинение","сопоставимость","сопоставление","сопостановщик","соправитель","соправительница","сопранист","сопранистка","сопрано","сопревание","сопредельность","соприкасание","соприкосновение","соприкосновенность","соприсутствие","сопричастник","сопричастность","сопричисление","сопроводитель","сопроводительница","сопровождающая","сопровождающий","сопровождение","сопромат","сопротивление","сопротивляемость","сопротивник","сопроцессник","сопряжение","сопряжённость","сопун","сопунья","сопутствие","сор","соразмерение","соразмерность","соратник","соратница","сорбит","сорванец","сорвиголова","сорго","сорговые","соревнование","соревнователь","соредактор","сорежиссёр","соринка","сориночка","сорит","сорность","сорняк","сорога","сородич","сорожка","сорок","сорока","сорокаведёрка","сорокалетие","сороковая","сороковик","сороковины","сороковка","сороковой","сороковочка","сороковушка","сороконожка","сорокопут","сорокоуст","сорокоуша","сорокоушка","сором","соромник","соромница","соромщина","сорочины","сорочка","сорочок","сорт","сортамент","сортимент","сортир","сортирование","сортировка","сортировочная","сортировщик","сортировщица","сортность","сортоиспытание","сортообновление","сортопрокатка","сортопрокатчик","сортосмена","сортучка","сорус","сосальщик","сосание","сосед","соседка","соседство","соседушка","сосенка","сосенник","сосец","сосиска","сосиски","сосисочная","соска","соскабливание","соскакивание","соскальзывание","соскок","соскребание","соскрёбывание","сосланная","сосланный","сослеживание","сословие","сословность","сослужащий","сослужение","сослуживец","сослуживица","сослужитель","сосна","сосновик","сосновые","сосняк","соснячок","сосок","сосочек","сосочка","сосредоточение","сосредоточенность","сосредоточивание","сосредоточие","состав","составитель","составительница","составление","состёгивание","состирывание","состольник","состояние","состояньице","состояньишко","состоятельность","сострагивание","сострадалец","сострадание","сострадатель","сострадательность","сострастие","сострачивание","состригание","состругивание","состязание","состязатель","состязательность","сосуд","сосудец","сосудик","сосулька","сосуля","сосун","сосунец","сосунок","сосуночек","сосунчик","сосуществование","сосчитывание","сот","сотая","сотворение","сотворчество","соте","сотейник","сотенка","сотенная","сотенник","сотенный","сотерн","сотка","сотни","сотник","сотничиха","сотня","сотоварищ","сотоварищество","сотоварка","сотрапезник","сотрапезница","сотрудник","сотрудница","сотрудничество","сотрясение","сотский","соты","сотый","соударение","соумышление","соумышленник","соумышленница","соус","соусник","соусница","соучастие","соучастник","соучастница","соученик","соученица","софа","софизм","софист","софистика","софистка","софит","софора","соффит","соха","сохатина","сохатиха","сохатый","сохач","сохозяин","сохран","сохрана","сохранение","сохранность","соцветие","социал-демократ","социал-демократия","социализация","социализм","социалист","социалистка","социальность","социолингвист","социолингвистика","социолог","социология","социум","сочевичник","Сочельник","сочень","сочетаемость","сочетание","сочетания","сочетательность","сочиво","сочинение","сочиненьице","сочинитель","сочинительница","сочинительство","сочлен","сочленение","сочность","сочувственник","сочувствие","сочувствующая","сочувствующий","сошествие","сошка","сошки","сошник","сошничок","сощипывание","союз","союзка","союзник","союзница","союзничек","соя","спагетти","спад","спазм","спазма","спай","спаивание","спайка","спайнолепестные","спайность","спайноцветник","спайщик","спайщица","спаленка","спалзывание","спальная","спальник","спальня","спаниель","спаньё","спардек","спаржа","спаржевые","спаривание","спарринг","Спарта","спартакиада","спартанец","спартанка","спарывание","Спас","спас","спасание","спасатель","спасение","спасибо","Спаситель","спаситель","спасительница","спасительность","спахивание","спаянность","спевка","спекаемость","спекание","спектакль","спектр","спектрограмма","спектрограф","спектрометр","спектрометрия","спектроскоп","спектроскопист","спектроскопия","спекулирование","спекулянт","спекулянтка","спекулятор","спекуляция","спелеолог","спелеология","спелость","спенсер","сперма","сперматозоид","спермацет","спермин","спёртость","спесивец","спесивица","спесивость","спесь","спех","спец","специализация","специализм","специалист","специалистка","специальность","специи","специфика","спецификатор","спецификация","специфичность","специя","спецкор","спецкурс","спецовка","спецодежда","спешка","спешность","спивание","спивки","Спид","спидвей","спидометр","спидофоб","спидофобия","спидофобка","спидофобство","спикер","спил","спиливание","спилка","спилок","спина","спинет","спинка","спиннинг","спиннингист","спираль","спиралька","спирант","спирея","спирит","спиритизм","спиритка","спиритуализм","спиритуалист","спиритуалистка","спирогира","спирометр","спирометрия","спирохета","спирт","спиртное","спиртование","спиртовка","спиртомер","спиртонос","списание","списатель","список","списочек","списчик","списывание","спихивание","спица","спич","спичечница","спичка","спички","спичрайтер","сплав","сплавка","сплавление","сплавщик","сплачивание","сплёвывание","сплетание","сплетение","сплётка","сплетник","сплетница","сплетничание","сплетня","сплин","сплотка","сплоток","сплочение","сплочённость","сплошняк","сплюшка","сплющивание","сподвижник","сподвижница","сподники","сподручник","сподручный","спожинки","Спожинки","спокойствие","споласкивание","сползание","спондей","спондилёз","спонсирование","спонсор","спонтанность","спор","спора","спорангий","споривший","спорина","спорность","споровик","споровые","спорок","споролистик","спорость","спорофилл","спорт","спортсмен","спортсменка","спорщик","спорщица","спорынья","спорящий","способ","способности","способность","способствование","способы","спотыкание","спотычка","справа","справедливость","справка","справность","справочка","справочник","справщик","спрашивание","спрей","спрессовывание","спринт","спринтер","спринцевание","спринцовка","спрос","спрут","спрыгивание","спрыскивание","спрягаемость","спряжение","спрямление","спуд","спурт","спуск","спускание","спутанность","спутник","спутница","спутывание","спячка","спящая","спящий","срабатывание","сработанность","сравнение","сравнивание","сравнимость","сравнительность","сражение","срам","срамец","срамник","срамница","срамословие","срамота","срастание","срачица","сращение","сращивание","сребреник","сребро","сребролюбец","сребролюбие","среда","средина","средневековье","среднее","средненёбный","среднеязычный","средоточие","средства","средство","срез","срезальщик","срезальщица","срезание","срезка","срезок","срезчик","срезчица","срезывание","срепетированность","Сретение","сретение","срисовка","срисовывание","сродич","сроднение","сродник","сродница","сродничек","сродность","сродственник","сродственница","сродственничек","сродство","срок","сростнолепестные","сростночелюстные","сросток","срочность","сруб","срубание","срубец","срубик","срубка","срубщик","срубщица","срыв","срывание","срывщик","срывщица","срыгивание","срытие","ссадина","ссаживание","ссасывание","ссекание","сселение","ссора","ссуда","ссудодатель","ссудополучатель","ссудоприниматель","ссучивание","ссылка","ссыльная","ссыльный","ссыпальщик","ссыпальщица","ссыпание","ссыпка","ссыпщик","стабилизатор","стабилизация","стабильность","стабунивание","став","ставенка","ставень","ставешек","ставешка","ставка","ставленник","ставленница","ставник","ставня","ставрида","ставридка","ставролит","ставропигия","стагнация","стадиальность","стадий","стадийность","стадион","стадия","стадность","стадо","стаж","стажёр","стажёрка","стажировка","стаивание","стайер","стайка","стакан","стаканчик","стаккато","стаккер","стаксель","сталагмит","сталагмометр","сталактит","сталевар","сталеварение","сталелитейщик","сталеплавильщик","сталепрокатчик","сталировка","сталкивание","сталь","стальник","стамеска","стаминодий","стамуха","стан","стандарт","стандартизация","стандартность","станина","станиоль","станица","станичка","станичная","станичник","станичный","станковист","станкостроение","станкостроитель","становиха","становище","становление","становой","становье","станок","станочек","станочник","станочница","станс","стансы","станцийка","станция","стапель","стапливание","стаптывание","старание","старания","старатель","старательница","старательность","старательство","старая","старейшина","старейшинство","старение","старец","старик","старикан","старикашка","старики","старина","старинка","старинность","старинушка","старинщик","старичина","старичишка","старичище","старичок","старичонка","старичьё","старка","старобытность","старовер","староверец","староверие","староверка","староверство","староверчество","стародавность","стародубка","старое","старожил","старожилец","старожилка","старожилы","старожильцы","старожительство","старозаветность","старолесье","старомодность","старообразность","старообрядец","старообрядка","старообрядство","старообрядчество","старорежимник","старорежимность","староречье","старослужащий","старослуживый","старослужилый","староста","старостиха","старость","старпом","старт","стартер","стартёр","старуха","старушенция","старушечка","старушка","старушонка","старушоночка","старчество","старчик","старшая","старшеклассник","старшеклассница","старшекурсник","старшекурсница","старшенькая","старшенький","старшие","старший","старшина","старшиниха","старшинка","старшинство","старшой","старый","старь","старьё","старьёвщик","старьёвщица","стаскивание","статеечка","статейка","статика","статист","статистик","статистика","статистка","статичность","статность","статор","статс-дама","статский","статс-секретарь","статуарность","статуйка","статус","статус-кво","статут","статуэтка","статуя","стать","статьишка","статьища","статья","стафилококки","стаффаж","стахановец","стахановка","стационар","стационарность","стационер","стация","стачечник","стачечница","стачивание","стачка","стая","ствол","стволина","стволистость","стволовой","ствольщик","створ","створаживание","створка","стеарин","стеатит","стебелёк","стебель","стеблевание","стеблеплод","стеблестой","стега","стегальщик","стегальщица","стегание","стёганка","стегно","стегозавр","стегоцефал","стёжка","стежок","стезя","стек","стека","стекание","стекление","стеклильщик","стекло","стеклование","стекловар","стекловарение","стекловатость","стекловыдувальщик","стеклограф","стеклографист","стеклографистка","стеклография","стеклодел","стеклоделие","стеклодув","стекломасса","стеклоочиститель","стеклоплав","стеклорез","стеклуемость","стёклышко","стеклянница","стеклянность","стеклярус","стекляшка","стеколышко","стекольце","стекольщик","стела","стелечка","стеллаж","стеллит","стелька","стельность","стен","стена","стенание","стенгазета","стенд","стендист","стендистка","стендовик","стенка","стенограмма","стенограф","стенографирование","стенографист","стенографистка","стенография","стенографка","стеноз","стенокардия","стенолаз","стенописец","стенопись","стенотипист","стенотипистка","стенотипия","стеночка","стены","стень","стеньга","степ","степенник","степенница","степенность","степенство","степень","степняк","степнячка","степнячок","степс","степь","стерва","стервец","стерво","стервоза","стервятина","стервятник","стереобат","стереография","стереозвук","стереометрия","стереоскоп","стереоскопичность","стереоскопия","стереотип","стереотипёр","стереотипия","стереотипность","стереофония","стерженёк","стерженщик","стерженщица","стержень","стерилизатор","стерилизация","стерильность","стерин","стерлинг","стерлядка","стерлядь","стерляжина","стерно","стернь","стерня","стёртость","стеснение","стеснённость","стеснительность","стёсывание","стетоскоп","стетоскопия","стечение","стивидор","стигма","стигматик","стилет","стилизатор","стилизаторство","стилизация","стилизованность","стилист","стилистика","стилистка","стилка","стило","стилобат","стиль","стильб","стильность","стильщик","стильщица","стиляга","стиляжничество","стимул","стимулирование","стимулятор","стимуляция","стипендиат","стипендиатка","стипендия","стипль-чез","стиракс","стираксовые","стирание","стирка","стирол","стих","стихарь","стихи","стихийность","стихира","стихирарь","стихия","стиховедение","стиходей","стихокропатель","стихокропательница","стихология","стихомания","стихоплёт","стихоплётство","стихослагатель","стихослагательство","стихосложение","стихотвор","стихотворение","стихотвореньице","стихотворец","стихотворица","стихотворство","стихотворчество","стишок","стишонки","стланец","стланик","стлань","стланьё","стлище","сто","стог","стогование","стогометание","стогометатель","стоечка","стожар","стожары","стожок","стойбище","стоик","стойка","стойкость","стойлице","стойло","стоимость","стоицизм","сток","стокер","стол","столб","столбец","столбик","столбище","столбняк","столбовая","столбовой","столбуха","столбушка","столетие","столетник","столец","столешник","столешница","столик","столица","столишко","столкновение","столование","столовая","столоверчение","столовка","столовник","столон","столоначальник","столп","столпец","столпление","столпник","столпничество","столпотворение","стольник","столяр","столяриха","столяришка","столярка","столярная","столярничание","столярничество","столярство","стоматит","стоматолог","стоматология","стоматоскоп","стомах","стометровка","стомчивость","стон","стоножка","стоп","стопа","стопка","стоп-кран","стопор","стопорение","стопосложение","стопоходящие","стопочка","стопроцентность","стоп-сигнал","стопы","сторица","сторно","сторновка","сторож","сторожа","сторожба","сторожевик","сторожевой","сторожение","сторожиха","сторожка","сторожок","сторона","сторонка","сторонник","сторонница","стороночка","сторонушка","стортинг","сторублёвая","сторублёвка","сточка","стояк","стоялец","стоялица","стояние","стоянка","стоячесть","стравливание","страда","страдалец","страдалица","страдальчество","страдание","страдатель","страдательность","страдиварий","страдивариус","страдник","страж","стража","стражник","страз","страна","страница","страничка","странник","странники","странница","странничество","странноприимная","странности","странность","странняя","страноведение","странствие","странствование","странствователь","страсти","страсти-мордасти","страстишка","Страстная","страстность","страстотерпец","страстотерпица","страстоцвет","страсть","стратагема","стратег","стратегик","стратегия","стратиграфия","стратисфера","стратификация","стратонавт","стратоплан","стратостат","стратосфера","страус","страусёнок","страусятина","страусятник","страх","страхование","страхователь","страховка","страховщик","страхота","страхующая","страхующий","страшение","страшила","страшилище","страшило","страшное","стрежень","стрекало","стрекоза","стрекозка","стрекот","стрекотание","стрекотня","стрекотунья","стрекотуха","стрекулист","стрела","Стрелец","стрелец","стрелка","стрелкование","стрелок","стрелолист","стрелочка","стрелочник","стрелочница","стрельба","стрельбище","стрельбы","стрельница","стрельчиха","стрёма","стременной","стремечко","стремёшка","стремительность","стремление","стремнина","стрёмщик","стремя","стремянка","стремянный","стренатка","стрепет","стрепетёнок","стрептококк","стрептококки","стресс","стрессор","стресс-подножка","стресс-фактор","стретта","стретто","стреха","стригальщик","стригальщица","стригольник","стригольничество","стригун","стригунок","стригунчик","стриж","стриженая","стриженый","стрижка","стрижок","стрижонок","стриктура","стрингер","стриппер","стриптиз","стриптизёр","стриптизёрка","стрихнин","строгаль","строгальщик","строгание","строганина","строгач","строгости","строгость","строение","строеньице","строй","стройбат","стройка","стройматериалы","стройность","строитель","строительство","строка","строки","стронций","строп","стропа","стропальщик","стропила","стропилина","стропило","строповка","стропотность","строптивая","строптивец","строптивица","строптивость","строптивый","строфа","строфант","строфика","строфокамил","строчечка","строчила","строчильщица","строчка","строчок","струбцина","струбцинка","струг","стругаль","стругальщик","стругание","струганина","стружечка","стружка","стружок","струи","струйка","структура","структурализм","структуралист","структурность","струна","струнка","струнник","струнные","струнобетон","струночка","струп","стручок","струя","стряпание","стряпня","стряпун","стряпуха","стряпчество","стряпчий","стряпчиха","стряхивание","студенец","студёность","студент","студентик","студентка","студенчество","студень","студиец","студийка","студия","стужа","стук","стукалка","стукание","стукач","стукотня","стукоток","стул","стульце","стульчак","стульчик","стулья","ступенчатость","ступень","ступенька","ступка","ступни","ступня","ступор","ступь","стучание","стушёвка","стыд","стыдливость","стыдоба","стыдобушка","стыдь","стык","стыкование","стылость","стынь","стычка","стюардесса","стяг","стягивание","стяжание","стяжатель","стяжательница","стяжательность","стяжательство","стяжение","стяжка","су","суаре","суахили","субалтерн","субалтерн-офицер","суббота","субботник","субвенция","субдоминанта","суберин","сублимат","сублиматы","сублимация","сублимирование","сублитораль","субмарина","субординация","суборь","субпродукт","субпродукты","субретка","субсидирование","субсидия","субстантивация","субстанциальность","субстанциональность","субстанция","субститут","субституция","субстрат","субстратостат","субстратосфера","субтильности","субтильность","субтитр","субтропики","субчик","субъект","субъективизм","субъективист","субъективность","сувенир","сувенирчик","суверен","суверенитет","суверенность","суворовец","суглинок","сугроб","суд","судак","суданец","суданка","суданцы","сударик","сударка","сударушка","сударынька","сударыня","сударь","судачение","судачина","судачок","судебник","судебня","судеец","судейская","судейство","судёнышко","судилище","судимость","судки","судно","судоверфь","судовладелец","судоводитель","судовождение","судок","судомойка","судомойня","судоподъём","судоподъёмник","судопроизводство","судопромышленник","судорабочий","судоремонт","судорога","судорожность","судостроение","судостроитель","судоустройство","судоходец","судоходность","судоходство","судохозяин","судочек","судьба","судьба-злодейка","судьбина","судьбинушка","судья","суевер","суеверие","суеверка","суеверность","суемудрие","суесвятство","суеслов","суесловие","суета","суетливость","суетность","суетня","суждение","суженая","сужение","суженый","суживание","суицид","сук","сука","сукна","сукно","сукновал","сукновальня","сукнодел","сукноделие","суковатость","суконка","суконце","суконщик","сукровица","сулейка","сулема","сулея","сулица","сулой","султан","султанат","султанка","султанство","султанчик","султанша","сульфаниламиды","сульфаты","сульфиды","сульфитация","сульфиты","сума","сумасброд","сумасбродка","сумасбродство","сумасшедшая","сумасшедший","сумасшедшинка","сумасшествие","суматоха","сумбур","сумбурность","сумеречки","сумеречность","сумерки","сумка","сумма","сумматор","суммирование","сумочка","сумочник","сумрак","сумрачность","сумчатые","сумятица","сундук","сундучишко","сундучник","сундучок","Сунна","суннизм","суннит","суннитка","суп","супер","суперарбитр","суперинтендент","суперкарго","супермаркет","супермен","супермодель","суперобложка","суперстрат","суперфосфат","супесок","супесь","супец","супин","супинатор","супинация","супник","супница","супонь","супоросная","супоросность","супоросость","супостат","супостатка","супплетив","супплетивизм","суппорт","супрематизм","супрематист","супрефект","супротивник","супротивница","супротивность","супруг","супруга","супруги","супружество","супружник","супружница","супряга","супрядки","сура","сургуч","сургучик","сурдина","сурдинка","сурдопедагог","сурдопедагогика","суренщик","сурепа","сурепица","сурепка","суржа","суржанка","суржик","сурик","сурна","суровец","суровость","суровьё","сурок","суррогат","сурчина","сурчонок","сурьма","сурьмило","сусак","сусала","сусалы","сусаль","сусальность","сусальщик","сусек","суслёнок","суслик","сусло","суслон","суспензия","суспензорий","сустав","суставчик","сутаж","сутана","сутемь","сутенёр","сутки","сутолока","сутолочь","суточные","сутуга","сутулина","сутуловатость","сутулость","сутунок","суть","сутяга","сутяжник","сутяжница","сутяжничество","суфизм","суфле","суфлёр","суфлирование","суфражизм","суфражистка","суффикс","суффиксация","суффозия","сухарик","сухарики","сухарница","сухарь","сухмень","суховатость","суховей","суходол","сухожилие","сухолюб","сухомятка","сухопарник","сухопутье","сухостой","сухостойник","сухость","сухота","сухотка","сухофрукты","сухоцвет","сухощавость","сухоядение","сухоядец","сучение","сучки","сучковатость","сучкорез","сучкоруб","сучок","сучочек","сучьё","суша","сушение","сушеница","сушенья","сушилка","сушило","сушильня","сушильщик","сушильщица","сушина","сушка","сушки","сушник","сушняк","сушь","сущее","существенное","существенность","существительное","существо","существование","существующее","сущность","суягная","суягность","сфагнум","сфалерит","сфера","сфероид","сферы","сфигмограмма","сфигмограф","сфигмография","сфинкс","сфинктер","сфрагистика","схватка","схватки","схватывание","схема","схематизатор","схематизация","схематизм","схематичность","схемка","схизма","схизматик","схизматичка","схима","схимник","схимница","схимничество","схимонах","схимонахиня","схлёбывание","сход","сходбище","сходка","сходни","сходность","сходство","сходцы","схожесть","схоласт","схоластик","схоластика","схоластицизм","схоластичность","схолиаст","схолии","сцеживание","сцена","сценарий","сценарист","сценаристка","сценариум","сценариус","сценичность","сценка","сцеп","сцепка","сцепление","сцепщик","сцепщица","Сцилла","счал","счаливание","счалка","счастливая","счастливец","счастливица","счастливчик","счастливый","счастье","счерпывание","счерчивание","счёс","счёска","счёсывание","счёт","счетовод","счетоводство","счётчик","счётчица","счёты","счисление","счистка","считалка","считание","считка","считчик","считчица","считывание","счищалка","сшибание","сшибка","сшивальщик","сшивальщица","сшивание","сшиватель","сшивка","съедание","съедение","съедобное","съедобность","съёживание","съезд","съём","съёмка","съёмник","съёмцы","съёмщик","съёмщица","сыворотка","сыгранность","сыгровка","сын","сынишка","сынок","сыноубийство","сыноубийца","сыночек","сыны","сыпец","сыпнотифозная","сыпнотифозный","сыпняк","сыпучесть","сыпь","сыр","сырец","сырник","сырники","сыровар","сыроварение","сыроварня","сыроватость","сыродел","сыроделие","сыроежка","сырок","сыромятина","сыромятник","сыромять","сыропуст","сырость","сыроядец","сырт","сырть","сырца","сыры","сырь","сырьё","сыск","сыскная","сыскное","сыта","сытая","сытник","сытность","сытость","сытый","сыть","сыч","сычонок","сычуг","сычужина","сыщик","сэндвич","сэр","сюжет","сюжетность","сюзерен","сюзеренитет","сюита","сюр","сюрпляс","сюрприз","сюрпризец","сюрреализм","сюрреалист","сюртук","сюртучишко","сюртучник","сюртучок","сюры","сюсюкание","сябёр","сябр","сяжки","сяжок","та","табак","табака","табакерка","табакерочка","табаковод","табаководство","табакокурение","табаконюхание","табак-самосад","табакур","табарган","табасаран","табасаранец","табасаранка","табасаранцы","табасараны","табачишко","табачище","табачник","табачница","табачок","табель","табелька","табель-календарь","табельная","табельщик","табельщица","таблетка","таблица","табличка","табло","таблоид","табльдот","табор","табу","табулирование","табулятор","табун","табунок","табунщик","табурет","табуретка","табуреточка","таверна","тавлинка","таволга","таволжанка","таволожка","таволожник","тавот","тавотница","тавр","таврение","тавричанка","тавро","тавры","тавтология","таган","таганка","таганок","таганчик","таджик","таджики","таджичка","таёжник","таёжница","таз","тазик","тазы","тайбола","тайга","тайм","тайм-аут","таймень","таймер","таймун","тайна","тайник","тайничок","тайнобрачие","тайнобрачные","тайноведец","тайновидец","тайнодействие","тайнопись","таинственник","таинственное","таинственность","таинство","тайфун","такальщик","такание","такелаж","такелажная","такелажник","такое","такой-то","такса","таксация","такси","таксировка","таксист","таксометр","таксомотор","таксопарк","таксофон","такт","тактик","тактика","тактильность","тактичность","такыр","тал","талант","талантик","талантишко","талантище","талантливость","таланты","талер","талес","талик","талина","талинка","талиночка","талисман","талия","Талия","талмуд","Талмуд","талмудизм","талмудист","талон","талончик","талреп","талыш","талыши","талышка","таль","тальвег","тальица","тальк","талька","тальма","тальмочка","тальник","тальянка","тальяночка","тальянщик","тамада","тамарикс","тамариксовые","тамаринд","тамариск","тамарисковые","тамбурин","тамбурмажор","тамга","таможенник","таможенный","таможня","тамошний","тамплиер","тампон","тампонада","тампонаж","тампонация","тампонирование","тамтам","танагра","танбур","тангенс","танго","тангут","тангутка","тангуты","тандем","танец","танин","танк","танкер","танкетка","танкетки","танкист","танкодром","танкостроение","танкостроитель","танок","Тантал","тантал","тантьема","танцевальность","танцевание","танцзал","танцкласс","танцмейстер","танцовщик","танцовщица","танцор","танцорка","танцплощадка","танцульки","танцующая","танцующий","танцы","тапёр","тапёрша","тапир","тапка","тапки","тапочка","тапочки","тара","тарабаган","тарабар","тарабарщина","таракан","таракановые","таран","таранение","таранка","таранта","тарантас","тарантасец","тарантасик","тарантелла","тарантул","таранча","таранчи","тарань","тарарам","тараса","таратаечка","таратайка","таратора","тараторение","тараторка","тарахтение","таращение","тарбаган","тарелка","тарелки","тарелочка","тарелочник","тарель","тари","тарирование","тарировка","тарист","тариф","тарификатор","тарификация","тарлатан","тармалама","тартальщик","тартание","Тартар","Тартарары","тартинка","тартюф","тартюфство","тархан","тархун","тары-бары","тарын","таска","таскальщик","таскание","таскотня","тасовка","тат","тата","татакание","татами","татарин","татарка","татарник","татарчонок","татарщина","татары","татка","татуирование","татуировка","татуировщик","татуировщица","таты","тать","татьба","татьянка","тау","тау-сагыз","тафта","тафтица","тафья","тахеометр","тахеометрия","тахикардия","тахометр","тахта","тацет","тачалка","тачальщик","тачальщица","тачание","тачанка","тачечник","тачка","ташка","таялка","таяние","тваринка","тварь","тварюка","тварюшка","твердение","твердо","твердокаменность","твердолобая","твердолобость","твердолобый","твердомер","твёрдость","твёрдый","твердыня","твердь","тверёзость","твержение","твид","твин","твиндек","твист","твоё","твои","твой","творение","Творец","творец","творило","творительный","творог","творожник","творожок","творчество","твоя","театр","театрал","театрализация","театралка","театральничание","театральность","театральство","театральщина","театрик","театровед","театроведение","театромания","тебенёвка","тевтоны","тегиляй","тезаврирование","тезаурус","тезирование","тезис","тезисы","тёзка","тезоименитство","теизм","тейлоризм","теин","теист","теистка","тёк","текинец","текинка","текинцы","текст","текстиль","текстильщик","текстильщица","текстовинит","текстовка","текстолит","текстолог","текстология","текстуальность","текстура","тектоника","текучесть","текучка","текущее","телевещание","телевидение","телевизионщик","телевизор","телега","телеграмма","телеграммка","телеграф","телеграфирование","телеграфист","телеграфистка","тележечка","тележечник","тележка","тележник","тележонка","телезритель","телезрительница","телеизмерение","телекс","телелюбитель","телемеханика","телёнок","теленомус","телёночек","телеобъектив","телеозавр","телеология","телепатия","телепередатчик","телепередача","телеприёмник","телеса","телескоп","телескопия","телесное","телестудия","телетайп","телетайпист","телеуправление","телеустановка","телефакс","телефон","телефон-автомат","телефонизация","телефонирование","телефонист","телефонистка","телефонисточка","телефония","телефонограмма","телефонщик","телефотография","телец","Телец","телецентр","телик","телица","тёлка","теллур","теллурий","тело","телогрейка","телогрея","телодвижение","телок","телорез","телосложение","телохранитель","тёлочка","телушка","тельник","тельняшка","тельпек","тельфер","тельца","тельце","теля","телятина","телятинка","телятник","телятница","тема","тематизм","тематика","тембр","темень","темечко","темка","темляк","тёмная","темница","тёмное","темнокожий","темнолицая","темнолицый","темнота","темнотища","темноты","темп","темпера","темперамент","темпераментность","температура","температурка","темперация","темпограф","темь","темя","тенардит","тенденциозничание","тенденциозность","тенденция","тендер","теневик","теневыносливость","тенёк","тенелюб","тенериф","тенёта","тенётник","тенёто","тенётчик","тенёчек","тензиметр","тензиометр","тензометр","тени","тенистость","теннис","теннисист","теннисистка","тенниска","тенор","тенорист","теноришко","тенорок","тент","тень","тенькание","теньковка","теобромин","теогония","теодицея","теодолит","теократия","теолог","теология","теорема","теоретизирование","теоретик","теоретичность","теорийка","теорик","теоричность","теория","теософ","теософия","теософка","тёпа","теперешнее","теплина","теплинка","теплица","тепличка","тепличник","тепличность","тепло","тепловик","тепловоз","тепловозостроение","тёплое","теплоёмкость","теплозащита","теплоизоляция","теплокровное","теплокровные","теплолечение","теплолюб","теплолюбивость","тепломер","теплоноситель","теплообмен","теплоотдача","теплопередача","теплопоглощение","теплопровод","теплопроводность","теплопродукция","теплопрозрачность","теплосеть","теплосиловая","теплоснабжение","теплостойкость","теплота","теплотворность","теплотехник","теплотехника","теплоустойчивость","теплофикация","теплоход","теплоходостроение","теплоцентраль","теплоэлектроцентраль","теплоэнергетика","теплушка","теплынь","терапевт","терапия","тератология","тератома","тербий","теребилка","теребильщик","теребильщица","теребление","терем","теремец","теремок","теремочек","терескен","терзание","терзания","терзатель","териодонт","териология","тёрка","терлик","термалама","термидор","термидорианец","термидорианство","термин","терминал","терминатор","терминизм","терминирование","терминист","терминология","термист","термит","термитник","термическая","термограф","термодинамика","термозит","термоизоляция","термолюминесценция","термометр","термометрия","термообработка","термопара","термопсис","терморегулятор","терморегуляция","термос","термоскоп","термостат","термостойкость","термотерапия","термофил","термофоб","термофосфат","термохимия","термоэлектричество","термоэлемент","термы","терн","тёрн","тернёв","терние","тернистость","терния","терно","терновка","терновник","тернослив","тернослива","тёрочка","терпёж","терпеливость","терпение","терпентин","терпимость","терпкость","Терпсихора","терпсихора","терпуг","терпужок","терразит","терракота","террарий","террариум","терраса","террасирование","терраска","террасы","терренкур","террикон","терриконик","территориальность","территория","террор","терроризирование","терроризм","террорист","террористка","терц","терцет","терцина","терция","тёрщик","тёрщица","терьер","терьеры","теряние","тёс","тесак","тесальщик","тесание","тесёмка","тесёмочка","тесина","тесинка","тёска","тесление","тесличка","тесло","теснение","теснина","теснитель","тесноватость","теснота","тесситура","тест","тестамент","тестенёк","тесто","тестомесилка","тесть","тестюшка","тесьма","тета","тетания","тетанник","тетанус","тет-а-тет","тет-де-пон","тётенька","тетёра","тетерев","тетеревёнок","тетеревиные","тетеревятник","тетёрка","тетерька","тетеря","тетёха","тётечка","тетива","тётка","тетрадища","тетрадка","тетрадочка","тетрадрахма","тетрадь","тетралогия","тетраметр","тетрарх","тетрархия","тетраэдр","тетрил","тётушка","тётя","теург","теургия","тефлон","тефтели","техминимум","технеций","техник","техника","техникум","техницизм","техничка","техничность","технократ","технократия","технолог","технологичность","технология","техред","течение","течка","течь","тёша","тёшка","тёща","тёщенька","тиамин","тиара","тибетец","тибетка","тибетцы","тиверец","тиверка","тиверцы","тигель","тигр","тигра","тигрёнок","тигрица","тигролов","тик","тикание","тиликание","тильбюри","тильда","тимберс","тимол","тимофеевка","тимошка","тимпан","тимпанит","тимуровец","тимуровцы","тимьян","тина","тинейджер","тинктура","тиокол","тип","типаж","типец","типизация","типизирование","типик","типикон","типическое","типичное","типичность","типограф","типография","типолитография","типолог","типология","типометр","типометрия","типоразмер","типун","типчак","типчик","тир","тирада","тираж","тиран","тиранизм","тирания","тиранка","тираноборец","тираноборчество","тираноубийство","тиранство","тире","тиреоидин","тиркушка","тиролец","тиролька","тирольки","тирольский","тирольцы","тирс","тис","тискальщик","тискание","тиски","тиснение","тисовые","тисочки","титан","титанит","титаны","титестер","титло","титовка","титр","титровальщик","титрование","титул","титулование","титулованная","титулованный","титулярный","титька","тиун","тиунство","тиф","тифдрук","тифлопедагогика","тифозная","тифозный","тифоид","тифон","Тифон","тифус","тихвинка","тиховодье","тихоня","тихоход","тихоходность","тишина","тишь","ткань","тканьё","ткацкая","ткач","ткачество","ткачиха","ткемали","тлен","тление","тленность","тлень","тлетворность","тля","тмин","то","товар","товарец","товаришко","товарищ","товарищество","товарка","товарник","товарность","товарный","товарняк","товаровед","товароведение","товарообмен","товарооборот","товаропроизводитель","товары","тога","тодес","тождественность","тождество","той","тойон","тойтерьер","ток","токай","токайское","токарная","токарничание","токарня","токарь","токката","токование","токовик","токовище","токоприёмник","токосъёмник","токсемия","токсикоз","токсиколог","токсикология","токсикоман","токсикомания","токсин","токсины","токсичность","ток-шоу","тол","толай","толевщик","толерантность","толика","толк","толкание","толкатель","толкач","толкач-толкачом","толки","толкование","толкования","толкователь","толковательница","толковитость","толковник","толковня","толковость","толкотня","толкун","толкунец","толкуны","толкучка","толмач","толокно","толокнянка","толоконце","толпа","толпища","толпище","толстая","толстина","толстобрюхая","толстобрюхий","толстовец","толстовка","толстовство","толстовщина","толстозадая","толстозадый","толстокожая","толстокожесть","толстокожий","толстолобик","толстомордая","толстомордый","толстоногая","толстоногий","толстоносая","толстоносый","толстопуз","толстопузая","толстопузый","толстопятая","толстопятый","толсторожая","толсторожий","толсторылая","толсторылый","толстосум","толстощёкая","толстощёкий","толстуха","толстушка","толстый","толстяк","толстячок","толчение","толчея","толчки","толчок","толща","толщина","толщинка","толь","том","томагавк","томагаук","томан","томасирование","томасшлак","томат","томбола","томбуй","томик","томилка","томильщик","томительность","томище","томление","томность","томпак","тон","тона","тональность","тондо","тонзиллит","тонзура","тонизация","тонизирующие","тонизна","тоник","тоника","тонина","тонирование","тонировка","тонкая","тонкий","тонкопрядение","тонкопряха","тонкость","тонмейстер","тонна","тоннаж","тоннелестроение","тоннель","тоннельчик","тоннельщик","тонно-километр","тонно-миля","тонус","тонфильм","тоня","топ","топаз","топание","топенант","топик","топика","топинамбур","топка","топкость","топление","топливо","топляк","топ-модель","топограф","топография","тополёк","тополог","топология","тополь","топольник","топоним","топонимика","топонимия","топор","топорик","топоришко","топорище","топорник","топорность","топорок","топорщение","топот","топотание","топотня","топоток","топочка","топсель","топтание","топтун","топчан","топшур","топшурист","топь","Тора","торба","торбаз","торбаза","торбан","торбанист","торбас","торбаса","торбочка","торг","торгаш","торгашество","торги","торговец","торговище","торговка","торговлишка","торговля","торгоут","торгоуты","торгпред","торгпредство","торгсин","тореадор","торевтика","тореро","торец","торжества","торжественность","торжество","торжище","тори","торизм","торий","торит","торица","торк","торки","торкрет","торкретбетон","торкретирование","торлоп","тормашка","торможение","тормоз","тормозильщик","тормошение","торн","торнадо","тороватость","торока","торопливость","торопыга","торопь","торос","торосистость","торосообразование","торошение","торпеда","торпедирование","торпедист","торпедник","торпедоносец","торпище","торс","торт","тортик","торф","торфобрикет","торфование","торфозаготовка","торфоразработка","торфорез","торфосос","торфотерапия","торфяница","торцевание","торцовка","торцовщик","торчок","торшер","торшон","торшонирование","тоска","тоскливость","тоскование","тост","тостер","тот","тотализатор","тоталитаризм","тоталитарист","тоталитарность","тотальность","тотем","тотемизм","тохар","тохары","точение","точечка","точилка","точило","точильная","точильня","точильщик","точка","точность","тошнота","тошнотворность","тощесть","тпрукание","трава","траверз","траверс","траверса","траверсирование","травертин","травести","травестировка","травильщик","травина","травинка","травища","травка","травление","травля","травма","травматизм","травматолог","травматология","травмирование","травокос","траволечение","травонька","травополье","травосеяние","травосмесь","травостой","травоядные","травушка","травщик","травы","травяник","травянка","трагедийность","трагедия","трагизм","трагик","трагикомедия","трагическое","трагичность","трагус","традесканция","традиционализм","традиционалист","традиционалистка","традиционность","традиция","траектория","трак","тракт","трактамент","трактат","трактация","трактир","трактиришко","трактирчик","трактирщик","трактирщица","трактование","трактовка","трактор","тракторист","трактористка","тракторишко","тракторостроение","трал","траление","тралер","тралирование","тралмейстер","тральщик","трамбак","трамбовальщик","трамбовальщица","трамбование","трамбовка","трамбовочка","трамбовщик","трамбовщица","трамвай","трамвайчик","трамвайщик","трамвайщица","трамонтана","трамплин","трамтарам","транжир","транжира","транжирка","транжирство","транзистор","транзит","транзитная","транзитник","транзитница","транзитный","транквилизатор","транквилизаторы","транс","трансбордер","трансгрессия","транскрибирование","транскрипция","транслитерация","трансляция","трансмиссия","транспарант","транспирация","трансплантат","трансплантация","трансплантология","транспозиция","транспонирование","транспонировка","транспорт","транспортабельность","транспортёр","транспортёрщик","транспортёрщица","транспортир","транспортирование","транспортировка","транспортировщик","транспортировщица","транспортник","транспортница","транссексуал","транссудат","трансураны","трансферкар","трансферт","трансформатор","трансформаторостроение","трансформаторщик","трансформация","трансформизм","трансформирование","трансформировка","трансформист","трансформистка","трансфузия","трансцендентализм","трансцендентальность","трансцендентность","транш","траншеекопатель","траншейка","траншея","трап","трапеза","трапезарь","трапезная","трапезник","трапезница","трапезничание","трапезование","трапеция","трапецоид","трапецоэдр","трапп","траппер","траппист","трасс","трасса","трассант","трассат","трассёр","трассирование","трассировка","трата","тратта","траттория","траулер","траур","траурница","траурность","трафарет","трафаретка","трафаретность","трафаретчик","трафление","трахеи","трахеиды","трахейнодышащие","трахеит","трахеотомированная","трахеотомированный","трахеотомия","трахея","трахит","трахома","треба","требище","требник","требование","требования","требовательность","требуха","требушина","тревога","тревоги","тревожность","треволнение","треволнения","тред-юнион","тред-юнионизм","тред-юнионист","тред-юнионы","трезвая","трезвенник","трезвенница","трезвенность","трезвон","трезвость","трезвучие","трезвый","трезубец","трек","трекратность","трелёвка","трелёвщик","трель","трельяж","трематодозы","трематоды","трембита","тремоландо","тремолит","тремоло","тремор","трен","тренаж","тренажёр","тренер","трензель","трензелька","трение","тренинг","тренированность","тренировка","трения","тренога","треножник","тренчик","трень-брень","тренькание","трепак","трепалка","трепало","трепальня","трепальщик","трепальщица","трепан","трепанация","трепанг","трепание","трепач","трепачка","трепачок","трепел","трепет","трепетание","трепетность","трёпка","трепло","трепня","трепотня","трепуша","трепушка","трепыхание","треск","треска","трескание","тресковые","трескообразные","трескотня","трескун","трескунья","трест","треста","трестирование","трестовик","третий","третирование","треть","третье","третьеклассник","третьеклассница","третьекурсник","третьекурсница","третьеразрядник","третьеразрядница","третья","третьяк","треуголка","треугольник","треугольничек","треух","треф","трефа","трефка","трефное","трефовка","трефы","трёхвёрстка","трехвостка","трёхголосие","трёхгранка","трёхгривенный","трёхкилометровка","трёхлетие","трёхлетка","трёхлеток","трёхлинейка","трёхперстие","трёхперстка","трёхперстки","трёхполье","трёхрядка","трёхсотая","трёхсотлетие","трёхсотый","трёхстволка","трёхтонка","трёхтысячная","трёхтысячный","трёххвостка","трёхцветка","трёхчасовой","трёхчлен","трёшка","трешкот","трешкоут","трёшник","трещалка","трещание","трещина","трещинка","трещиноватость","трещотка","трещотки","три","триада","триангуляция","триас","триба","трибун","трибуна","трибунал","тривиальность","тривиум","тригонометрия","тридцатая","тридцатилетие","тридцатка","тридцатый","тридцатьчетвёрка","триединство","триер","триера","триерование","триеровка","тризна","трикирий","триклиний","трико","трикотаж","трикотажник","трикотажница","трикотин","триктрак","трилиственник","трилистник","триллер","трилобит","трилогия","триместр","тринадцатая","тринадцатилетие","тринадцатый","тринитротолуол","трином","трио","триод","триодь","триолет","триоль","триостренник","трип","трипаносома","триперстка","триплан","триплекс","триплет","триппер","трипсин","триптих","трирема","трисель","тритий","тритон","Тритон","триумвир","триумвират","триумф","триумфатор","трифоль","трифтонг","трихина","трихинелла","трихинеллёз","трихиноз","трихотомия","трицепс","троакар","трог","трогание","трогательность","троглодит","троеборье","троебрачие","троеженец","троежёнство","троекратность","троелистка","троемужие","троение","троеперстие","троетёс","троечка","троечник","троечница","тройка","тройник","тройня","тройняшка","тройняшки","тройственность","троица","Троица","тройчатка","троичность","трок","троллей","троллейбус","троллейбусник","троллейкара","тролль","тромб","тромбоз","тромбон","тромбонист","тромбофлебит","тромп","трон","тронутая","тронутый","троп","тропа","тропарь","тропик","тропики","тропина","тропинка","тропиночка","тропка","тропление","тропник","тропопауза","тропосфера","тропот","тропота","тропочка","трос","тросик","тростильщик","тростильщица","тростина","тростинка","тростиночка","тростка","тростник","тростничок","тросточка","трость","тростянка","трот","тротил","тротуар","тротуарчик","трофей","трофоневрозы","трохей","троцкизм","троцкист","троцкистка","трощение","троякость","трояшка","труба","трубадур","трубач","трубка","трубка-носогрейка","трубкование","трубковёрт","трубкожил","трубкозуб","трубконос","трубкорылы","трубник","трубоволочение","трубоволочильщик","трубоклад","трубокур","труболётка","трубопровод","трубопроводчик","трубопрокатчик","труборез","трубостав","трубоукладчик","трубоцвет","трубочист","трубочка","трубочная","трубочник","трубчатка","трубчонка","трувер","труд","трудное","трудноплавкость","трудности","трудность","трудовик","трудодень","трудоёмкость","трудолюб","трудолюбец","трудолюбивая","трудолюбивый","трудолюбие","трудоспособная","трудоспособность","трудоспособный","трудотерапия","трудоустройство","труды","трудяга","трудящийся","труженик","труженица","труженичество","труп","трупик","труппа","труппка","трус","трусик","трусики","трусиха","трусишка","трусишки","трусливая","трусливость","трусливый","трусоватость","трусость","трусца","трусы","трут","трутень","трутник","трутница","трутовик","трутовики","трутовиковые","трутовка","трутовые","труха","трухлявость","трухляк","трущоба","трынка","трыночка","трынчик","трюизм","трюк","трюкач","трюкачество","трюм","трюмный","трюмо","трюмсель","трюфелевые","трюфели","трюфель","тряпица","тряпичка","тряпичник","тряпичница","тряпичность","тряпка","тряпки","тряпкорез","тряпкорезка","тряпкорубка","тряпкорубщик","тряпочка","тряпочник","тряпьё","трясавица","трясение","трясилка","трясильщик","трясина","тряска","тряскость","трясогузка","трясун","трясунка","трясуны","трясучая","трясучка","трясца","туалет","туалетная","туаль","туальденор","туарег","туареги","туба","туберкул","туберкулёз","туберкулёзная","туберкулёзник","туберкулёзница","туберкулёзный","туберкулин","туберкулы","тубероза","тубус","тувинец","тувинка","тувинцы","туга","тугай","тугайный","тугодум","тугоплавкость","тугоухая","тугоухий","тугоухость","тугрик","тугун","туер","туес","туесок","туесочек","тужурка","туз","туземец","туземка","туземность","тузик","тузлук","тузлукование","тук","тукан","тукание","туки","тукманка","тукоразбрасыватель","тукосмесь","тул","тулес","тулий","туловище","тулово","тулуз","тулук","тулумбас","тулун","тулуп","тулупишко","тулупище","тулупник","тулупчик","тулупчишко","тулупщик","тулья","туляремия","тумак","туман","туманище","туманность","туманограф","туманчик","туманы","тумба","тумбочка","тун","туна","тунг","тунгус","тунгуска","тунгусы","тундра","тундрянка","тунец","тунеяд","тунеядец","тунеядица","тунеядка","тунеядство","тунеядчество","туннелестроение","туннель","туннельчик","туннельщик","тунцовые","тупей","тупейщик","тупец","тупик","тупица","тупичок","туповатость","тупоголовая","тупоголовость","тупоголовый","туподум","туполобая","туполобие","туполобость","туполобый","тупость","тупоумец","тупоумие","тур","тура","туранга","турач","турбаза","турбина","турбинист","турбинка","турбинная","турбинщик","турбобур","турбобурение","турбовоз","турбогенератор","турбодинамо","турбонасос","турбостроение","турбостроитель","турбоход","турбоэлектроход","турбулентность","турбуленция","турель","турёнок","туризм","турист","туристка","турица","турка","туркеня","туркестанец","туркестанка","туркестанцы","турки","туркиня","туркмен","туркменка","туркмены","туркофил","туркофильство","туркофоб","туркофобство","турлушка","турлыкание","турмалин","турман","турне","турнепс","турник","турникет","турнир","турнюр","турнюра","турок","турпан","турсук","турусы","турухтан","турф","турчание","турчанка","турчин","турчонок","тускловатость","тусклость","тусовка","тусовщик","тусовщица","тустеп","тут","тута","тутовник","тутовница","тутовод","тутоводство","тутовые","тутор","тутти","туттист","туф","туфейка","туфелька","туфельки","туфли","туфля","туфобетон","туфолава","тухлинка","тухловатость","тухлость","тухлятина","тухлятинка","туча","тученька","тучка","тучность","туш","туша","туше","тушевальщик","тушевальщица","тушевание","тушёвка","тушение","тушёнка","тушилка","тушильник","тушист","тушка","тушкан","тушканчик","тушь","туя","тщание","тщательность","тщедушие","тщедушность","тщеславие","тщеславность","тщета","тщетность","тыкание","тыква","тыквенник","тыквенные","тыквина","тыл","тыловик","тылы","тын","тынок","тырло","тырса","тысчонка","тысяцкий","тысяча","тысячелетие","тысячелетия","тысячелистник","тысяченожка","тысячи","тысячная","тысячник","тысячный","тычина","тычинка","тычинник","тычиночка","тычок","тьма","тьма-тьмущая","тэк","тюбетей","тюбетейка","тюбик","тюбинг","тюбингоукладчик","тюбингщик","тюк","тюкание","тюкование","тюковка","тюковщик","тюленебоец","тюленёнок","тюленина","тюленка","тюлень","тюль","тюльбюри","тюлька","тюльпан","тюльпанчик","тюлюлюкание","тюник","тюника","тюрбан","тюрбе","тюрбо","тюремщик","тюремщица","тюрик","тюрк","тюрки","тюркизм","тюрколог","тюркология","тюркос","тюрчанка","тюрька","тюрьма","тюря","тюряга","тютелька","тютюн","тютя","тюфяк","тюфячок","тюха","тючок","тябло","тявкание","тявкуша","тяга","тягач","тяглец","тягло","тягловый","тягомер","тягостность","тягость","тягота","тяготение","тяготы","тягучесть","тяж","тяжба","тяжелоатлет","тяжелобольная","тяжелобольной","тяжеловатость","тяжеловес","тяжеловесность","тяжеловоз","тяжелодум","тяжелораненая","тяжелораненый","тяжесть","тяжкодум","тянульщик","тянульщица","тянучка","тяпание","тяпка","тятенька","тятька","тятя","уазик","уанстеп","убавка","убавление","убаюкивание","убегание","убедительность","убеждение","убеждения","убеждённость","убежище","убивание","убиение","убиенная","убиенный","убийственность","убийство","убийца","убитая","убитость","убитый","ублаготворение","ублажатель","ублажение","ублюдок","убогая","убогий","убогость","убожество","убой","убоина","убойная","убойность","убойщик","убор","убористость","уборка","уборная","уборочная","уборщик","уборщица","убранство","уброд","убрус","убывание","убыль","убыстрение","убыток","убыточность","уважаемая","уважаемый","уважение","уважительность","увал","увалень","уваливание","увалка","увальность","увальчивость","увальчик","увар","уваривание","уварка","уваровит","уварщик","уведение","уведомление","увезение","увековечение","увековечивание","увеличение","увеличитель","увеличительность","увенчание","увенчивание","уверение","уверенность","уверительность","уверование","увёрстка","увёрстывание","увёртка","увёртливость","увёртывание","увертюра","увеселение","увеселитель","увеселительница","увесистость","увет","уветливость","увечье","увешивание","увещание","увещатель","увещевание","увещеватель","увивание","увиливание","увинчивание","увлажнение","увлажнённость","увлажнитель","увлекательность","увлечение","увлечённость","увод","уводчик","увоз","уволакивание","уволенная","уволенный","увольнение","увольнительная","увольняемая","увольняемый","увраж","уврачевание","увулярный","увядание","увязание","увязка","увязывание","угадка","угадливость","угадчивость","угадчик","угадчица","угадывание","угадыватель","угар","угарец","угасание","углаживание","углевод","углеводород","углеводороды","углеводы","углевоз","угледобыча","углежжение","углежог","углекислота","углекоп","углемойка","угленосность","углепогрузчик","углеподатчик","углепромышленник","углепромышленность","углеразрез","углерод","углесос","угличи","угловатости","угловатость","угловая","угловушка","угломер","углубитель","углубление","углублённость","углышек","угль","углярка","угнетаемая","угнетаемый","угнетатель","угнетательница","угнетающая","угнетающий","угнетение","угнетённая","угнетённость","угнетённый","уговаривание","уговор","уговорщик","уговорщица","угода","угодливость","угодник","угодница","угодничание","угодничек","угодничество","угодное","угодность","угодье","угождение","угол","уголёк","уголёчек","уголовная","уголовник","уголовница","уголовный","уголовщик","уголовщина","уголовщица","уголок","уголочек","уголышек","уголь","уголье","угольная","угольница","угольничек","угольщик","угольщица","угомон","угон","угонка","угорание","угорь","угорье","угоститель","угощение","угрев","угрева","угревание","угреватость","угрёвые","угроза","угрозыск","угрубление","угры","угрызение","угрюмость","уд","уда","удабривание","удав","удавка","удавление","удавленник","удавовые","удавчик","удаление","удалённость","удалец","удалость","удаль","удальство","удар","ударение","ударник","ударница","ударничество","ударность","ударчик","удары","удача","удачливость","удачник","удачница","удачность","удваивание","удвоение","удевятерение","удел","уделывание","удельничество","удельность","удерж","удержание","удерживание","удесятерение","удешевление","удивительность","удивление","удила","удилище","удило","удильник","удильщик","удильщица","удлинение","удлинённость","удмурт","удмуртка","удмурты","удобность","удобоваримость","удобоисполнимость","удобопереносимость","удобопонятность","удобопроизносимость","удобоусвояемость","удобочитаемость","удобрение","удобство","удовлетворение","удовлетворённость","удовлетворительно","удовлетворительность","удовольствие","удод","удодовые","удой","удойливость","удойность","удол","удолие","удорожание","удостаивание","удостоверение","удотка","удочерение","удочка","удручение","удушение","удушливость","удушье","удэ","удэге","удэгеец","удэгейка","удэгейцы","удэхе","удэхеец","удэхейка","удэхейцы","уединение","уединённость","уезд","уезжающая","уезжающий","уём","уж","ужак","ужаление","ужаривание","ужас","ужасы","ужение","ужеобразные","уживчивость","ужик","ужимание","ужимка","ужимочка","ужин","ужовые","ужонок","уза","узаконение","узаконивание","узбек","узбеки","узбечка","узда","уздень","уздечка","узел","узелок","узелочек","узик","узилище","узина","узковатость","узкоглазие","узкоколейка","узколобие","узконосые","узкость","узловатость","узловязатель","узнавание","узник","узница","узничество","узор","узористость","узорочность","узорочье","узорчатость","узорчик","узость","узуальность","узурпатор","узурпаторство","узурпаторша","узурпация","узус","узы","уйгур","уйгурка","уйгуры","уик-энд","уйма","уймища","уймище","указ","указание","указатель","указательный","указка","указчик","указчица","указывание","укалывание","укание","укатка","укатывание","укачивание","уквашивание","укипание","укисание","уклад","укладка","укладчик","укладчица","укладывание","уклеивание","уклейка","уклея","уклон","уклонение","уклонист","уклонистка","уклончивость","уключина","укол","уколачивание","укомплектование","укомплектовка","укомплектовывание","уконопачивание","укор","укорачивание","укоренение","укоризна","укорот","укорота","укорочение","укос","укосина","украдка","украина","украйна","украинец","украинизация","украинизм","украинка","украинофил","украинофильство","украинцы","украшатель","украшательство","украшение","укрепа","укрепление","укромность","укроп","укропчик","укротитель","укротительница","укрощение","укрупнение","укручивание","укрывание","укрыватель","укрывательница","укрывательство","укрытие","укрюк","укрючина","уксус","уксусник","уксусница","укупоривание","укупорка","укупорщик","укупорщица","укус","укутывание","улавливание","улавливатель","улаживание","уламывание","улан","уланка","уланы","улар","улащивание","улей","улем","улемы","улепётывание","улетучивание","улещание","улещение","улика","улит","улита","улитка","улица","уличение","уличи","уличитель","уличительница","уличка","уличная","уличный","улов","уловистость","уловитель","уловка","уложение","улочка","улус","улусник","улучшение","улы","улыба","улыбка","улыбочка","улыбчивость","ульта","ультимативность","ультиматизм","ультиматист","ультиматум","ультимо","ультра","ультразвук","ультраконсерватор","ультрамарин","ультрамонтан","ультрамонтанство","ультрафиолет","ульч","ульчанка","ульчи","улюлюкание","улюлюкивание","ум","умаление","умаливание","умалишённая","умалишённый","умалчивание","умасливание","уматывание","умащение","умащивание","умбра","умбры","умелец","умелость","умение","уменьшаемое","уменьшение","уменьшительность","умеренная","умеренность","умеренный","умершая","умерший","умерщвление","уместность","умёт","умётчик","умиление","умилённость","умилительность","умилостивление","умильность","умирание","умирающая","умирающий","умирение","умиритель","умиротворение","умиротворённость","умиротворитель","умиротворительница","умишко","умище","умлаут","умляут","умная","умник","умница","умничание","умножение","умный","умовение","умозаключение","умозрение","умозритель","умозрительность","умоисступление","умок","умолкание","умолот","умолчание","умонастроение","умоначертание","умопомешательство","умопомрачение","умопомрачительность","умор","умора","уморение","уморительность","умочек","умствование","умствователь","умудрённость","умы","умывалка","умывальная","умывальник","умывальница","умывальня","умывание","умыкание","умысел","умышленность","умягчение","унавоживание","унанимизм","унанимист","унаследование","Ундина","униат","униатка","униаты","универмаг","универсал","универсализация","универсализм","универсалист","универсалия","универсалы","универсальность","универсант","универсантка","универсиада","университант","университанта","университет","университетский","универсум","унижение","униженная","униженность","унижённость","униженный","унизительность","унизывание","уник","уника","уникальность","уникум","унион","унионизм","унисон","унитаз","унитаризм","унификатор","унификация","униформа","униформист","уничижение","уничижительность","уничтожение","уния","унос","уносы","унта","унтер","унтер-офицер","унтер-офицерство","унтер-офицерша","унтертон","унтертоны","унты","унция","унылость","уныние","упадничество","упадок","упадочник","упадочничество","упадочность","упаковка","упаковочная","упаковщик","упаковщица","упаковывание","упалзывание","упаривание","упарка","упёк","упелёнывание","упиливание","упитанность","упихивание","уплата","уплачивание","уплотнение","уплотнённость","уплотнитель","уплощение","уплощённость","уплывание","упование","уподобление","упоение","упоённость","упоительность","упокоение","упокой","уполномоченная","уполномоченный","уполовник","упоминание","упоминовение","упор","упорность","упорство","упорствование","упорядочение","употребительность","употребление","управа","управделами","управдом","управдомша","управитель","управительница","управительство","управительша","управленец","управление","управляемость","управляющий","упражнение","упражнения","упразднение","упрашивание","упрашивающая","упрашивающий","упревание","упреждение","упрёк","упроститель","упростительство","упрочение","упрочнение","упрощенец","упрощение","упрощённость","упрощенство","упрощенчество","упругость","упряжка","упряжь","упрямец","упрямица","упрямость","упрямство","упущение","упущенное","упырь","ура","уравнение","уравнивание","уравниловец","уравниловка","уравнительность","уравновешенность","ураган","ураза","уразумение","уралец","Уран","уран","уранинит","Урания","уранография","ура-патриот","ура-патриотизм","Урарту","урарты","урбанизация","урбанизм","урбанист","урбанистка","урду","урегулирование","урез","урезка","урезывание","урема","уремия","уретра","уретрит","уретроскоп","уретроскопия","урильник","урина","урман","урна","уробактерии","уробактерия","уровень","урод","уродец","уродик","уродина","уродиха","уродище","уродка","уродливость","уродование","уродство","урожай","урожайность","уроженец","уроженка","урок","уроки","уролог","урология","урометр","урон","урочище","уругваец","уругвайка","уругвайцы","урчание","урюк","уряд","урядник","урянхаец","урянхайка","урянхайцы","ус","усадебка","усадка","усадочность","усадьба","усадьбишка","усаживание","усаливание","усатый","усач","усваивание","усвоение","усвояемость","усекание","усекновение","усёнки","усердие","усердная","усердность","усердный","усердство","усердствование","усердствующая","усердствующий","усечение","усидчивость","усик","усики","усиление","усиливание","усилие","усилитель","усилительность","усилия","усина","усишки","усище","усищи","ускок","ускорение","ускоритель","услада","усладитель","усладительница","услаждение","условие","условия","условность","усложнение","усложнённость","услуга","услуги","услужение","услуживание","услужливость","услужник","услужница","услышание","услышанное","усма","усмарь","усматривание","усмешечка","усмешинка","усмешка","усмирение","усмиритель","усмотрение","уснащение","усобица","усовершенствование","усовершимость","усол","усолье","усоногие","усопшая","усопший","успеваемость","Успение","успение","успех","успехи","успешность","успокаивание","успокаивающее","успокоение","успокоитель","успокоительница","успокоительное","успокоительность","уста","устав","уставшая","уставший","уставщик","уставщица","усталая","усталость","усталый","усталь","установитель","установительница","установка","установление","установочка","установщик","устарелость","устерс","устерса","устилка","устность","устои","устой","устойка","устойчивость","устранение","устрашение","устремление","устремлённость","устрица","устроение","устройство","устроитель","устроительница","устроительство","уступ","уступец","уступка","уступок","уступочек","уступочка","уступчатость","уступчивость","уступчик","устыжение","устье","устьице","усугубление","усушка","усчитывание","усы","усылка","усыновитель","усыновление","усыпальница","усыпание","усыпитель","усыпление","усыхание","ут","утаение","утаивание","утайка","утайщик","утайщица","утачивание","утачка","утварь","утвердительность","утверждение","утемнение","утёнок","утёночек","утёныш","утепление","утеплитель","утеря","утёс","утёсистость","утёска","утеснение","утеснитель","утеснительница","утеха","утечка","утешение","утешеньице","утешитель","утешительница","утешительность","утешительство","утешник","утешница","утилизатор","утилизаторство","утилизация","утилитаризм","утилитарист","утилитаристка","утилитарность","утиль","утильзавод","утильсырьё","утильцех","утильщик","утильщица","утиные","утиральник","утиральничек","утирание","утирка","утица","утишение","утка","утконос","утлегарь","уток","утоление","утолитель","утолока","утолщение","утомительность","утомление","утомлённость","утомляемость","утончение","утончения","утончённости","утончённость","утоп","утопавшая","утопавший","утопающая","утопающий","утопизм","утопист","утопистка","утопичность","утопия","утопление","утопленник","утопленница","утор","уторка","уторник","уторщик","уточина","уточка","уточнение","уточник","утраквист","утраквисты","утрамбовка","утрата","утренник","утренничек","утреня","утречко","утрирование","утрировка","утро","утроба","утробишка","утробища","утробушка","утроение","утруска","утучнение","утюг","утюжение","утюжильщик","утюжильщица","утюжка","утюжник","утюжок","утя","утягивание","утяжеление","утяжелитель","утяжка","утятина","утятинка","утятник","утятница","уха","ухаб","ухабик","ухабина","ухабинка","ухабистость","ухажёр","ухажёрка","ухажёрство","ухаживание","ухаживатель","ухание","ухарство","ухарь","ухват","ухватик","ухватка","ухватывание","ухищрение","ухищрённость","ухмылка","ухмылочка","ухналь","ухо","уховёртка","уход","ухожь","ухожье","ухорез","ухудшение","уценка","учан","участие","участливость","участник","участница","участок","участочек","участь","учащаяся","учащение","учащённость","учащийся","учёба","учебник","учебничек","учение","ученик","ученица","ученичество","ученичок","учёность","учёный","учёт","учетверение","учётчик","учётчица","училище","учинение","учителишка","учитель","учителька","учительница","учительская","учительство","учительша","учитывание","учредитель","учредительница","учредительство","учреждение","учреждения","учтивец","учтивости","учтивость","учуг","ушан","ушанка","ушат","уши","ушиб","ушивание","ушивка","уширение","уширитель","ушица","ушка","ушкан","ушки","ушко","ушкуй","ушкуйник","ушник","ушу","ущелина","ущелистость","ущелье","ущемление","ущерб","ущербность","уют","уютность","уязвимость","уязвление","уязвлённость","уяснение","фа","фабианец","фабианизм","фабианство","фаблио","фабльо","фабра","фабрение","фабрика","фабрика-кухня","фабрикант","фабрикантша","фабрикат","фабрикатор","фабрикация","фабрикование","фабриковка","фабричка","фабричная","фабричник","фабричница","фабричное","фабричный","фабричонка","фабричушка","фабула","фавероль","фавн","Фавн","фавор","фаворит","фаворитизм","фаворитка","фавус","фаги","фагот","фаготерапия","фаготик","фаготист","фаготчик","фагоцит","фагоцитоз","фагоциты","фадом","фаза","фазан","фазанарий","фазанёнок","фазанина","фазанинка","фазаниха","фазанка","фазановод","фазановодство","фазановые","фазаночка","фазанчик","фазенда","фазис","фазорегулятор","фазотрон","фай","файдешин","файл","файф-о-клок","факел","факелы","факельцуг","факельщик","факельщица","факино","факир","факиришка","факирство","факолит","факс","факсимиле","факт","фактец","фактизм","фактик","фактисы","фактичность","фактишка","фактограф","фактографичность","фактография","фактор","факториал","факторист","фактория","факторство","факторша","фактотум","фактура","фактурность","факультатив","факультативность","факультет","фал","фалалей","фаланга","фалангист","фаланстер","фаланстерия","фалбала","фалда","фалдочка","фалерист","фалеристика","фалинь","фалл","фаллос","фаллус","фалреп","фалрепный","фальбала","фальконет","фальсификат","фальсификатор","фальсификация","фальсифицирование","фальсифицированность","фальстарт","фальстаф","фальц","фальцгобель","фальцевание","фальцет","фальцетик","фальцетность","фальцовка","фальцовщик","фальцовщица","фальшборт","фальшивинка","фальшивка","фальшивомонетничество","фальшивомонетчик","фальшивомонетчица","фальшивость","фальшкиль","фальшфейер","фальшфейерник","фальшь","фамилизм","фамилия","фамильярничание","фамильярность","фамильярство","фамулус","фанабер","фанаберия","фанаберка","фанаберство","фанариот","фанариоты","фанат","фанатизм","фанатик","фанатичка","фанатичность","фанг","фанданго","фанера","фанерка","фанерование","фанеровка","фанеровщик","фанеровщица","фанерщик","фанерщица","фанзочка","фант","фантазёр","фантазёрка","фантазёрство","фантазийка","фантазирование","фантазия","фантасмагория","фантаст","фантастика","фантастическое","фантастичность","фантастка","фантик","фантики","фантом","фанты","фанфара","фанфарист","фанфарон","фанфаронада","фанфарониада","фанфаронишка","фанфаронство","фанфары","фара","фарад","фарада","фарадизация","фарандола","фараон","фарватер","фаренгейт","фарингальный","фарингит","фарингоскопия","фарисеи","фарисей","фарисейка","фарисейство","фармазон","фармазонка","фармазонство","фармакогнозия","фармаколог","фармакология","фармакопея","фармакотерапия","фармакохимия","фармацевт","фармацевтика","фармация","фарс","фарсёр","фарси","фарт","фартинг","фартук","фартучек","фарфор","фарш","фарширование","фаршировка","фас","фасад","фасадик","фасадчик","фасет","фасетка","фаска","фасовка","фасовочная","фасовщик","фасовщица","фасоль","фасон","фасонистость","фасончик","фасонщик","фасонщица","фасциация","фасция","фат","фата","фатализм","фаталист","фаталистичность","фаталистка","фатальность","фата-моргана","фатоватость","фатовство","фатство","фатум","фатюй","фауна","фаунист","фаунистика","фаустпатрон","фаут","фаутность","фахверк","фацелия","фацеция","фация","фашизация","фашизм","фашина","фашинник","фашион","фашионабель","фашионабельность","фашист","фашистка","фаэтон","фаэтончик","фаэтоны","фаялит","фаянс","февраль","федерализация","федерализм","федералист","федералистка","федерат","федераты","федерация","федерирование","фединг","фееричность","феерия","фейербахианец","фейербахианство","фейерверк","фейерверкер","фейхоа","фекалии","феллах","феллахи","феллема","феллоген","фелон","фелонь","фелука","фельдмаршал","фельдмаршальство","фельдмаршальша","фельдсвязь","фельдфебель","фельдфебельство","фельдфебельша","фельдцейхмейстер","фельдшанец","фельдшер","фельдшерица","фельдъегерь","фельетон","фельетонист","фельетонистка","фельетонность","фельетончик","фельетонщик","фелюга","Фемида","феминизация","феминизм","феминист","феминистка","фен","фён","фенакит","фенакод","фенацетин","Феникс","фенол","фенолог","фенология","феноменализм","феноменалист","феноменальность","феноменолог","феноменология","фенопласт","фенотип","фенхель","феод","феодал","феодализация","феодализм","ферзь","ферлакур","ферлакурство","ферма","фермата","фермент","ферментация","фермер","фермерство","фермерша","фермочка","фермуар","фернамбук","фероньера","фероньерка","феррит","ферросплав","ферросплавщик","ферротипия","ферт","фертильность","ферула","ферязь","фес","феска","фесочка","фестиваль","фестон","фестончик","фетиш","фетишизация","фетишизирование","фетишизм","фетишист","фетр","фетюк","фефёла","фехраль","фехтмейстер","фехтовальщик","фехтовальщица","фехтование","фешенебель","фешенебельность","фешенебль","фея","фи","фиакр","фиал","фиалка","фиалочка","фиаско","фибра","фибрилла","фибрин","фибриноген","фибробласт","фибробласты","фиброз","фиброин","фибролит","фиброма","фиброцит","фибры","фибула","фиг","фига","фигаро","фигли","фигли-мигли","фигляр","фиглярничание","фиглярство","фигура","фигуральность","фигурант","фигурантка","фигурация","фигурирование","фигурист","фигуристка","фигурка","фидеизм","фидеист","фидеистка","фидель","фиеста","фижмы","физалис","физзарядка","физиатр","физиатрия","физик","физика","физиогномика","физиография","физиократ","физиократы","физиолог","физиологист","физиологичность","физиология","физиономика","физиономист","физиономистика","физиономистка","физиономия","физиотерапевт","физиотерапия","физичка","физия","физкультура","физкультурник","физкультурница","физмат","физорг","физрук","фиксаж","фиксатив","фиксатор","фиксатуар","фиксация","фиксирование","фиктивность","фикус","фикция","фила","филадельфус","филант","филантроп","филантропизм","филантропия","филантропка","филармония","филарх","филателизм","филателист","филателистка","филателия","филе","филей","филейчик","филёнка","филёночка","филёр","филетирование","филиал","филиация","филигранность","филигранщик","филигранщица","филигрань","филин","филинёнок","филипон","филиппика","филиппинец","филиппинка","филиппинцы","филипповец","филипповка","Филипповки","филипповцы","филипповщина","филирование","филировка","филистер","филистерство","филистимляне","филистимлянин","филистимлянка","филлер","филлит","филлодий","филлокактус","филлокладий","филлоксера","филлоксероустойчивость","филлофора","филогенез","филогенезис","филогения","филодендрон","филолог","филология","философ","философичность","философия","философка","философствование","филуменист","филуменистка","филумения","фильдекос","фильдеперс","фильер","фильера","филька","фильм","фильмокопия","фильмоскоп","фильмостат","фильмотека","фильтр","фильтрат","фильтрация","фильтрование","фильтровка","фильтровщик","фильтровщица","фильтрпресс","фильц","филя","филярии","филяриоз","фимиам","фимоз","финагент","финал","финалист","финалистка","финаль","финансирование","финансист","финансистка","финансы","финвал","финик","финикиец","финикийка","финикийцы","финикиянин","финикиянка","финифть","финичек","финиш","финишер","финиширование","финка","финляндец","финляндка","финн","финна","финноз","финно-угровед","финно-угроведение","финно-угры","финны","финт","финтиклюшка","финтифанты","финтифлюшечка","финтифлюшка","финтифлюшки","финьшампань","фиорд","фиоритура","фирма","фирман","фирн","фисгармоника","фисгармония","фиск","фискал","фискала","фискалка","фискаломания","фискальничание","фискальство","фисташка","фисташковые","фисташник","фистула","фистулография","фита","фитилёк","фитиль","фитин","фитинг","фитономус","фитопалеонтолог","фитопалеонтология","фитопатолог","фитопатология","фитопланктон","фитофаг","фитофтора","фитюлька","фифа","фифи","фификус","фихтеанец","фихтеанство","фиш","фишбалка","фишечка","фишка","фишю","флавон","флавоны","флаг","флагеллант","флагеллантство","флагелланты","флаг-капитан","флагман","флаг-офицер","флагшток","флаг-штурман","флажок","флажолет","флакон","флакончик","фламандец","фламандка","фламандцы","фламин","фламинго","фланг","фланговый","фланелевка","фланель","фланелька","фланёр","фланёрство","фланец","фланк","фланкёр","фланкирование","фланкировка","флат","флаттер","флебит","флегма","флегматизатор","флегматизация","флегматизм","флегматик","флегматичность","флегмона","флейт","флейта","флейтист","флейтистка","флейточка","флейц","флейцевание","флейцовка","флексатон","флексивность","флексия","флексор","флексура","флектирование","флёр","флёрдоранж","флёрница","флеш","флешь","флибустьер","флибустьерство","флигелёк","флигелёчек","флигель","флигель-адъютант","флигель-адъютантство","флигельман","флик","флик-фляк","флинт","флинта","флинтглас","флирт","флогопит","флокен","флокс","флора","флорентиец","флорентийка","флорентийцы","флорин","флорист","флористика","флот","флотарий","флотатор","флотация","флотик","флотилия","флотирование","флотируемость","флотоводец","флотский","флоэма","флуктуация","флуоресценция","флуороскоп","флюгарка","флюгарочка","флюгельгорн","флюгер","флюгерок","флюгерство","флюид","флюиды","флюктуация","флюоресценция","флюорит","флюороскоп","флюс","флюсование","флюсовка","флютбет","фляга","флягомойка","флягопропариватель","фляжечка","фляжка","фоб","фобия","фогт","фогтство","фойе","фок","фока-рей","фок-мачта","фок-рея","фокс","фоксик","фокстерьер","фокстрот","фокстротик","фокус","фокусирование","фокусировка","фокусник","фокусница","фокусничание","фокусничество","фокус-покус","фокусы","фол","фолиант","фолио","фолишон","фолликул","фолликулы","фольварк","фольга","фольговщик","фольклор","фольклорист","фольклористика","фольклористка","фольклорность","фомка","фон","фонарик","фонарщик","фонарь","фонастения","фонация","фонд","фонды","фонема","фонендоскоп","фонетика","фонетист","фонетистка","фоника","фонограмма","фонограф","фонографирование","фонография","фонология","фонометр","фоноскоп","фонотека","фонтан","фонтанирование","фонтанчик","фонтанщик","фора","форвакуум","форвард","форд","фордевинд","фордек","фордизм","фордик","фордыбака","фордыбачение","форейтор","форель","форестьер","форестьера","форзац","форинт","форма","формализация","формализм","формалин","формалист","формалистика","формалистичность","формалистка","формальдегид","формальности","формальность","формальщина","формант","форманта","форманты","фор-марс","фор-марса-рей","фор-марсель","формат","формативы","формация","формирование","формировка","формировщик","формование","формовка","формовочная","формовщик","формовщица","формоизменение","формоизменяемость","формообразование","формотворчество","формочка","формула","формулирование","формулировка","формулировочка","формуляр","формы","форпик","форпост","форс","форсаж","форсирование","форсированность","форсистость","форс-мажор","фор-стеньга","форстерит","форсун","форсунка","форсунщик","форсунья","форт","форте","фортель","фортепианист","фортепианистка","фортепиано","фортепианщик","фортепьянист","фортепьянистка","фортепьяно","фортепьянщик","фортеция","фортиссимо","фортификатор","фортификация","фортка","форточка","Фортуна","фортуна","фортунка","фортунщик","форум","форшлаг","форшмак","форшпиль","форштадт","форштевень","фосген","фоска","фосфат","фосфатирование","фосфаты","фосфид","фосфиды","фосфор","фосфоресценция","фосфоресцирование","фосфорит","фосфоритование","фосфориты","фосфоричность","фосфорность","фосфоробактерин","фот","фотарий","фотиния","фото","фотоаппарат","фотоаппаратура","фотоателье","фотобумага","фотовспышка","фотогелиограф","фотогеничность","фотогравирование","фотогравюра","фотограмметрия","фотограф","фотографизм","фотографирование","фотография","фотокамера","фотокарточка","фотокерамика","фотокопия","фотокорреспондент","фотолаборатория","фотолампа","фотолиз","фотолитография","фотолюбитель","фотолюбительство","фотолюминесценция","фотомагазин","фотоматериал","фотометр","фотометрия","фотомеханика","фотомонтаж","фотон","фотонабор","фотообъектив","фотопередатчик","фотопериодизм","фотопластинка","фотоплёнка","фотопортрет","фотопулемёт","фотореактив","фотореле","фоторепортаж","фоторепортёр","фотосинтез","фотоснимок","фотостат","фотосфера","фотосъёмка","фототаксис","фототека","фототелеграмма","фототелеграф","фототелеграфия","фототерапия","фототипия","фототок","фототропизм","фотоувеличитель","фотофиниш","фотофобия","фотохимия","фотохромизм","фотохромия","фотохроника","фотоэкспонометр","фотоэлемент","фотоэтюд","фотоэффект","фофан","фрагмент","фрагментарность","фраер","фраза","фразеологизм","фразеологичность","фразеология","фразёр","фразёрка","фразёрство","фразировка","фразистость","фразочка","фрайер","фрак","фракиец","фракийка","фракийцы","фрактура","фракционер","фракционерка","фракционирование","фракционность","фракция","фрамуга","франк","франки","франкировка","франкмасон","франкмасонка","франкмасонство","франкмасоны","франко","франко-вагон","франко-валюта","франт","франтирёр","франтиха","франтоватость","франтовство","француженка","француз","французик","французишка","французоман","французомания","французы","фратрия","фрау","фрахт","фрахтование","фрахтователь","фрахтовка","фрахтовщик","фрачишка","фрачишко","фрачок","фрегат","фреза","фрезерование","фрезеровка","фрезеровщик","фрезеровщица","фрейдизм","фрейдист","фрейлейн","фрейлина","фрекен","френолог","френология","френч","френчик","фреска","фривольность","фригидность","фригиец","фригийка","фригийцы","фриз","фризка","фризы","фрикадели","фрикадель","фрикаделька","фрикадельки","фрикасе","фрикативный","фрикцион","фристайл","фритредер","фритредерство","фритюр","фритюрница","фриц","фрицы","фриштик","фриштык","фронда","фрондёр","фрондёрка","фрондёрство","фрондирование","фронт","фронтальность","фронтиньяк","фронтиспис","фронтит","фронтовик","фронтовичка","фронтон","фру","фрукт","фруктовщик","фруктовщица","фруктоза","фрукты","фря","фтизиатр","фтизиатрия","фтизик","фтор","фуга","фуганок","фугас","фугаска","фугато","фугетта","фугование","фуговка","фуговщик","фужер","фузариоз","фузариум","фузея","фузилёр","фук","фука","фукание","фукс","фуксин","фуксия","фукус","фуле","фульгурит","фульгуриты","фуляр","фуляртин","фумаролы","фумиганты","фумигация","фундамент","фундаментализм","фундаменталист","фундаментальность","фундирование","фундук","фуникулёр","функционализм","функционалист","функциональность","функционер","функционирование","функция","фунт","фунтик","фунтовик","фура","фураж","фуражечка","фуражечник","фуражечница","фуражир","фуражирование","фуражировка","фуражка","фургон","фургончик","фургонщик","фурия","Фурия","фурма","фурман","фурманка","фурманщик","фурнитура","фурор","фурункул","фурункулёз","фурфурол","фурчание","фуршет","фурштат","фурщик","фурьеризм","фурьерист","фут","футбол","футболист","футболистка","футболка","футер","футерование","футеровка","футеровщик","футляр","футлярчик","футор","футуризм","футурист","футуристка","футуролог","футурология","футшток","фуфаечка","фуфайка","фуфло","фуфыря","фухтель","фуэте","фыркание","фыркун","фыркунья","фырчание","фьорд","фюзеляж","фюрер","хабалка","хабанера","хабар","хабара","хабарник","хабарь","хабитус","хавбек","хавронья","хавтайм","хадж","хаджи","хадис","хазават","хазар","хазарин","хазарка","хазары","хай","хайло","хакас","хакаска","хакасы","хакер","хаки","хала","халат","халатик","халатишко","халатность","халва","халвичник","халвичница","халда","халдеи","халдей","халдейка","халиф","халифат","халифство","халтура","халтурка","халтурщик","халтурщина","халтурщица","халупа","халцедон","халява","хам","хамелеон","Хамелеон","хамелеоновые","хамелеонство","хамелеоны","хамит","хамитка","хамиты","хамка","хамлет","хамовник","хамса","хамсин","хамство","хамьё","хан","хандра","ханжа","ханжество","ханство","ханты","хантыец","хантыйка","хантыйцы","ханша","ханшин","хаос","хаотичность","хапание","хапанцы","хапуга","хапун","хапунья","харакири","характер","характерец","характеристика","характеристичность","характерное","характерность","харатья","Харибда","харизма","Харита","хариус","харкание","харкота","харкотина","харкун","харкунья","Харон","хартия","харч","харчевание","харчевая","харчевник","харчевница","харчевня","харчи","харчишки","харчо","харя","хасид","хасидизм","хата","хатка","хаха","хахалишка","хахаль","хахальница","хаханьки","хашиш","хвала","хвалебник","хвалебница","хвалебность","хвалёна","хвалёная","хваление","хвалёнка","хвалёное","хвалёный","хвалимая","хвалимое","хвалимый","хвалитель","хвалительница","хвальба","хвальбишка","хвастание","хвастливость","хвастня","хвастовство","хвастун","хвастунишка","хвастунья","хват","хватание","хватка","хваткость","хвоение","хвойник","хвойниковые","хвоинка","хвойные","хворание","хворая","хвороба","хворост","хворостина","хворостинка","хворостинник","хворостняк","хворосты","хворость","хворый","хворь","хвост","хвостатые","хвостец","хвостик","хвостист","хвостистка","хвостишко","хвостище","хвостовик","хвостовка","хвосты","хвощ","хвощевидные","хвощёвые","хвощи","хвоя","хедер","хедерник","хедив","хеппи-энд","хер","хердель","херес","херик","хертель","херувим","херувимская","херувимчик","хетт","хеттеянка","хетты","хи","хиазм","хиазма","хиатус","хибара","хижина","хижинка","хилая","хилость","хилый","хиляк","химера","химеричность","химерность","химеровые","химеры","химизатор","химизация","химизм","химик","химикалии","химикат","химикаты","химиотерапия","химичка","химия","химкомбинат","химснаряд","химчистка","хина","хинди","хинду","хиндустанец","хиндустани","хиндустанка","хиндустанцы","хинин","хинная","хиппи","хирагра","хирагрик","хирение","хиромант","хиромантик","хиромантия","хиромантка","хиротония","хирург","хирурги","хирургия","хит","хитин","хитон","хитоны","хит-парад","хитрец","хитреца","хитринка","хитросплетение","хитрость","хитроумие","хитрюга","хитряга","хитрячка","хи-хи","хихикание","хищение","хищник","хищники","хищница","хищничество","хищность","хищные","хлад","хладнокровие","хладнокровность","хладноломкость","хладобойня","хладостойкость","хлам","хламида","хламидомонада","хламьё","хлап","хлеб","хлебание","хлебенное","хлебец","хлебина","хлебная","хлебник","хлебница","хлебное","хлебня","хлёбово","хлебодар","хлебозавод","хлебозаготовитель","хлебозаготовки","хлебозакупки","хлебок","хлебокопнитель","хлебопашество","хлебопашец","хлебопёк","хлебопекарня","хлебопечение","хлебопоставки","хлебопродукты","хлебопромышленник","хлеборез","хлеборезка","хлебороб","хлеборобие","хлеборобство","хлебород","хлебородие","хлебородность","хлебосдатчик","хлебосдача","хлебосол","хлебосолка","хлебосольство","хлебостой","хлеботорговец","хлеботорговля","хлебоуборка","хлебофураж","хлеб-соль","хлебушек","хлебушко","хлебцы","хлев","хлевец","хлевок","хлевушок","хлёст","хлестаков","хлестаковство","хлестаковщина","хлестание","хлёсткость","хлобыстание","хлопальщик","хлопанец","хлопание","хлопанцы","хлопающая","хлопающий","хлопец","хлопковод","хлопководство","хлопкокомбайн","хлопкоочистка","хлопкороб","хлопкоробка","хлопкосеяние","хлопкоуборка","хлопок","хлопотание","хлопотишки","хлопотливость","хлопотность","хлопотня","хлопотун","хлопотунья","хлопоты","хлопочущая","хлопочущий","хлопуша","хлопушка","хлопчатка","хлопчатник","хлопчик","хлопья","хлор","хлорат","хлоратор","хлораты","хлорацетофенон","хлорид","хлориды","хлорирование","хлорит","хлориты","хлорка","хлороз","хлорозная","хлорозный","хлоропласт","хлоропласты","хлорофилл","хлороформ","хлороформирование","хлорпикрин","хлуп","хлупь","хлын","хлыновец","хлыст","хлыстание","хлыстик","хлыстовка","хлыстовство","хлыстовщина","хлыщ","хлюпание","хлюпик","хлюпкость","хлюст","хлябь","хляскание","хлястание","хлястик","хмара","хмарь","хмелёвка","хмелевод","хмелеводство","хмелёк","хмелина","хмелинка","хмелиночка","хмелинушка","хмель","хмельник","хмельное","хмелюшко","хмурение","хмурость","хмурь","хмыкание","хна","хныкала","хныкание","хобби","хобот","хоботок","ход","ходатай","ходатайница","ходатайство","ходатайствование","ходики","ходимость","ходкость","ходок","ходули","ходулочник","ходулька","ходульки","ходульное","ходульность","ходуля","ходун","ходунки","ходунок","ходьба","ходячая","ходячий","хожатая","хожатый","хождение","хоженое","хозрасчёт","хозяйка","хозяин","хозяйничание","хозяйничество","хозяйское","хозяйственник","хозяйственность","хозяйство","хозяйствование","хозяюшка","хоккей","хоккеист","хоккеистка","холдинг","холение","холера","холерик","холерина","холерная","холерный","холестерин","холецистит","холка","холл","холм","холмик","холмистость","холмогорка","холод","холода","холодец","холодильник","холодильня","холодильщик","холодина","холодище","холодненькое","холодник","холодноватость","холодное","холоднокровие","холоднокровный","холодность","холодок","холодостойкость","холодоустойчивость","холодочек","холодюга","холодюка","холокост","холоп","холопишка","холопка","холопство","холостая","холостёжь","холостой","холостяга","холостяк","холостячка","холостячок","холочка","холощение","холст","холстик","холстина","холстинка","холстиночка","холуй","холуйка","холуйство","холуяж","холява","хомут","хомутик","хомутина","хомутишко","хомутник","хомуток","хомутчик","хомяк","хомячок","хон","хондрилла","хондрома","хонингование","хоппер","хор","хорал","хорват","хорватка","хорваты","хорда","хордовые","хордометр","хорей","хорёк","хореограф","хореография","хорея","хорист","хористка","хористочка","хориямб","хоркание","хормейстер","хоровик","хоровод","хороводик","хороводник","хороводница","хоромина","хоромы","хорошая","хорошее","хорошенькая","хорошенький","хорошенькое","хорошесть","хороший","хорошо","хорт","хортая","хорты","хортый","хоругвеносец","хоругвь","хорунжий","хорунжиха","хоры","хорь","хорьковые","хорьчонок","хота","хотение","хохлатка","хохлатки","хохлаточка","хохлатушка","хохлач","хохлуша","хохлушечка","хохлушка","хохма","хохмач","хохол","хохолок","хохот","хохотание","хохотня","хохоток","хохотун","хохотунья","хохотуша","хохотушка","храбрая","храбрейшая","храбрейший","храбрец","храбрость","храбрый","храм","храмина","храмовник","храмоздатель","храмоздательство","храмостроитель","хранение","хранилище","хранитель","хранительница","храп","храпак","храпение","храповик","храпоидол","храпок","храпун","храпунья","хребет","хребтина","хребтовина","хребтуг","хрен","хренина","хреновник","хренок","хрестоматия","хризантема","хризоберилл","хризолит","хризопраз","хризотил","хрип","хрипение","хрипловатость","хриплость","хриповатость","хрипота","хрипотца","хрипун","хрипунья","хрипы","христарадник","христарадница","христарадничество","христианизация","христианин","христианка","христианство","христолюбец","христопродавец","Христос","христосик","христослав","христосование","хрия","хром","хромание","хроматизм","хроматин","хромая","хромель","хромий","хромирование","хромировка","хромировщик","хромит","хромой","хромолитограф","хромолитография","хромоногая","хромоногий","хромоногость","хромоножка","хромосома","хромосомы","хромосфера","хромота","хромофотография","хроник","хроника","хроникальность","хроникёр","хронист","хронограф","хронография","хронолог","хронологизация","хронология","хронометр","хронометраж","хронометражист","хронометражистка","хронометрист","хроноскоп","хрупание","хрупкость","хруст","хрусталик","хрусталь","хрустальность","хрустение","хрущ","хрущак","хрыч","хрычовка","хрюкало","хрюкание","хрюшка","хряк","хряпа","хряпка","хряск","хряст","хрящ","хрящеватость","хрящевик","хрящевина","хрящевые","хрящик","худерьба","худо","худоба","худое","художественность","художество","художник","художница","художничество","худородство","худосочие","худость","худощавая","худощавость","худощавый","худрук","худсовет","худшая","худшее","худший","худышка","хула","хуление","хулиган","хулиганка","хулиганство","хулиганьё","хулитель","хулительница","хунвейбин","хунвейбинка","хунвейбины","хунну","хунта","хурал","хурма","хутор","хуторец","хуторишко","хуторная","хуторный","хуторок","хуторочек","хуторская","хуторской","хуторянин","хуторянка","цадик","цанга","цапелька","цапина","цапка","цапля","цапун","цапунья","цапфа","царапание","царапина","царапинка","царапка","царевич","царевна","царедворец","царёк","цареубийство","цареубийца","царизм","царица","царишка","царственность","царствие","царство","царствование","царь","цаца","цацка","цвет","цветение","цветень","цветик","цветистость","цветная","цветник","цветничок","цветное","цветной","цветовод","цветоводство","цветоед","цветок","цветоложе","цветомузыка","цветоножка","цветонос","цветочек","цветочник","цветочница","цветочницы","цветуха","цвинькание","цвирикание","цвиркание","цевка","цевница","цевьё","цедилка","цедильщик","цедра","цеж","цежение","цезаризм","цезарь","цезий","цезура","цейтнот","цейхгауз","целебность","целенаправленность","целение","целесообразность","целестин","целеуказание","целеустремление","целеустремлённость","целибат","целизна","целик","целина","целинник","целинница","целитель","целительница","целительность","целковый","целлофан","целлулоид","целлюлит","целлюлоза","целовальник","целовальница","целовальничиха","целование","целое","целомудренность","целомудрие","целостат","целостность","целость","цель","цельба","цельноголовые","цельность","цемент","цементация","цементирование","цементировка","цементит","цементник","цементование","цементовка","цементовоз","цементохранилище","цемент-пушка","цемянка","цена","ценз","цензор","цензорство","цензура","цензурность","цензурование","ценитель","ценительница","ценник","ценное","ценности","ценность","ценовщик","ценообразование","цент","центавр","центнер","центр","централ","централизация","централизм","централка","централь","центральность","центризм","центрирование","центрировка","центрист","центрифуга","центрифугирование","центричность","центробег","центробежка","центрование","центровка","центровщик","центровщица","центроплан","центросома","центурион","центурия","цеолит","цеолиты","цеп","цепенение","цепень","цепи","цепкость","цепляние","цепочка","цеппелин","цепь","цербер","Цербер","церебральный","церемониал","церемониальность","церемонии","церемониймейстер","церемония","церемонник","церемонница","церемонность","церква","церквёнка","церквушка","церковище","церковка","церковник","церковница","церковное","церковнославянизм","церковнослужитель","церковность","церковь","цесаревич","цесаревна","цесарка","цесарь","цех","цехин","цеховщина","цеце","циан","цианизация","цианирование","цианоз","цибуля","цивилизация","цивилизованность","цивилист","цивилистика","цивильность","цигара","цигарка","цигарочка","цигейка","цидула","цидулка","цидулочка","цикада","цикадовые","цикады","цикл","цикламен","циклевание","циклёвка","циклёвщик","циклизация","цикличность","циклование","циклоида","циклон","Циклоп","циклоп","циклопы","циклотрон","цикля","цикорий","цикута","цилиндр","цилиндрик","цимбалист","цимбалы","цимлянское","цинга","цинготная","цинготник","цинготный","цинерария","цинизм","циник","циничность","цинк","цинкит","цинкование","цинкограф","цинкография","цинния","циновка","циновочка","цинубель","циперус","цирк","циркач","циркачество","циркачка","циркон","цирконий","циркорама","циркулирование","циркуль","циркуляр","циркулярчик","циркуляция","цирк-шапито","цирлих-манирлих","цирроз","Цирцея","цирцея","цирюльник","цирюльня","циста","цистерна","цистит","цитадель","цитата","цитатка","цитатничество","цитатор","цитатчик","цитация","цитирование","цитогенетика","цитодиагностика","цитология","цитоплазма","цитохимия","цитра","цитрон","цитрус","цитрусовод","цитрусоводство","цитрусовые","циферблат","циферка","цифирь","цифра","цифрация","цифровка","цифры","цицеро","цокание","цокающая","цокающий","цоколь","цокот","цокотание","цокотуха","цуг","цук","цукание","цукат","цукаты","цунами","цуцик","цыбик","цыган","цыгане","цыганёнок","цыганка","цыганочка","цыганщина","цыганы","цыкание","цыпа","цыпка","цыпки","цыплёнок","цыплёночек","цыплятина","цыплятинка","цыплятник","цыплятница","цыпочка","цыпушка","чабан","чабарня","чабер","чабёр","чабрец","чавкание","чавыча","чага","чад","чадо","чадолюбие","чадородие","чадорождение","чадоубийца","чадра","чадушко","чадь","чаевание","чаёвник","чаёвница","чаёвничание","чаевод","чаеводство","чаевые","чаёк","чаепийца","чаепитие","чаеторговля","чаи","чай","чайка","чайковые","чайная","чайник","чайница","чайничание","чайничек","чаинка","чайные","чайхана","чайханщик","чаишко","чакан","чаканка","чакона","чал","чалая","чалдар","чалдон","чалка","чалма","чалмоносец","чалый","чальщик","чан","чанахи","чановой","чановщик","чанщик","чапельник","чапига","чапиги","чаплажка","чапыга","чапыги","чапыжник","чара","чардаш","чарка","чарльстон","чарование","чаровник","чаровница","чародей","чародейка","чародейство","чародеяние","чарочка","чартер","чартизм","чартист","чары","час","часик","часики","часишки","часишко","часовенка","часовник","часовня","часовой","часовщик","часок","часослов","часочек","частик","частица","частицы","частичка","частичность","частник","частница","частное","частнопрактикующий","частность","частокол","частота","частотность","частуха","частуховые","частушечник","частушечница","частушка","часть","часы","чаус","чау-чау","чауш","чахлость","чахотка","чахоточная","чахоточный","чахохбили","чачван","чаша","чашелистик","чашечка","чашка","чашник","чаща","чащица","чащоба","чаяние","чвакание","чван","чванливость","чванство","чебак","чебачок","чёбот","чеботарь","чёботы","чебурек","чебуречная","чегень","чек","чека","чекан","чеканка","чеканность","чеканчик","чеканщик","чекань","чекист","чекистка","чекмарь","чекменёк","чекменишко","чекмень","чекодатель","чекуша","чекушка","челеста","чёлка","чёлн","челнок","челночник","челночница","челночок","чело","челобитие","челобитная","челобитчик","челобитчица","человек","человек-невидимка","человеко-день","человеколюбец","человеколюбие","человеконенавидение","человеконенавистник","человеконенавистничество","человекоубийство","человекоубийца","человеко-час","человечек","человеческое","человечество","человечина","человечишка","человечище","человечность","чёлочка","челюсть","челядинец","челядинка","челядь","чемарка","чембало","чембур","чемер","чемерика","чемерица","чемерка","чемодан","чемоданишко","чемоданище","чемоданчик","чемоданщик","чемпион","чемпионат","чемпионесса","чемпионка","чемпионство","чепан","чепанишко","чепанчик","чепец","чепечник","чепечница","чепига","чепиги","чепрак","чепрачник","чепрачок","чепуха","чепуховина","чепчик","чепыга","чепыги","черва","червеобразные","червец","черви","червивость","червление","червобой","червобоина","червовод","червоводня","червоводство","червонец","червонка","червонный","червонцы","червончик","червоточина","червоточинка","червы","червь","червяк","червячишка","червячище","червячок","чердак","чердачок","черевик","черевики","черевичек","черевички","черёд","череда","чередование","через","череззерница","черемис","черемиса","черемисин","черемиска","черемисы","черёмуха","черёмушка","черёмушник","черемха","черемша","черен","черенкование","черенок","черенщик","череп","черепаха","черепашина","черепашка","черепица","черепичник","черепные","черепок","черепослов","черепословие","черепочек","черепушечка","черепушка","чересло","чересполосица","чересполосность","чересседелень","чересседельник","черешенка","черешня","черешок","черкан","черкание","чёркание","черкес","черкеска","черкесы","черкешенка","чернавка","чернавочка","чернавушка","чёрная","чернение","чернец","черни","чернизна","черника","чернила","черниленка","чернилка","чернильница","чернинка","черница","черничество","черничина","черничка","черничник","чернобородый","чернобровая","чернобровка","чернобровый","чернобурка","чернобыл","чернобыль","чернобылье","чернобыльник","черновая","черновик","черноволосая","черноволосый","черноглазая","черноглазка","черноглазый","черноголовая","черноголовка","черноголовник","черноголовый","черногорец","черногорка","черногорцы","черногуз","чёрное","черножелчие","чернозём","чернозобик","чернозубая","чернозубый","черноклён","чернокнижество","чернокнижец","чернокнижие","чернокнижник","чернокнижничество","чернокожая","чернокожий","черноколоска","чернокорень","чернокрылая","чернокрылый","чернокудрая","чернокудрый","чернолесье","черноликая","черноликий","чернолицая","чернолицый","чернолоз","черномазая","черномазый","черномордая","черномордый","черноморец","черноногая","черноногий","черноокая","черноокий","черноплодка","чернорабочая","чернорабочий","черноризец","чернородье","чернорубашечник","чернорясная","чернорясник","чернорясница","чернорясный","чернослив","черносливина","черносмородинная","черносмородиновая","черносотенец","черносотенник","черносотенство","черносошник","черносошный","черноспинка","черностоп","чернота","чернотал","чернотелка","чернотроп","черноуска","чернуха","чернушка","чёрные","чёрный","черныш","чернь","чернявая","чернявый","черняк","черпак","черпалка","черпало","черпальная","черпальня","черпальщик","черпальщица","черпание","черпачок","черствение","чёрствость","чёрт","Чёрт","черта","чертёж","чертёжик","чертёжная","чертёжник","чертёжница","чертёнок","чертёночек","чёртик","чертилка","чертовка","чертовня","чертовщина","чертовщинка","чертог","чертогон","чертополох","чёрточка","чёртушка","черты","чертыхание","чертяга","чертяка","черчение","чёс","чесалка","чесальня","чесальщик","чесальщица","чёсанец","чесание","чёсанки","чёсанок","чёсаночек","чёсаночки","чёска","чеснок","чесночник","чесночница","чесночницы","чесотка","чесоточная","чесоточный","чествование","честер","честная","честнейшая","честнейший","честность","честный","честолюб","честолюбец","честолюбие","честь","чесуча","чёт","чета","четверг","четверик","четвёрка","четверня","Четвероевангелие","четвероклассник","четвероклассница","четверокурсник","четверокурсница","четвероногие","четвероногое","четверорукие","четверорукое","четверостишие","четвероугольник","четверохолмие","четвёрочник","четвёрочница","четвертак","четвёртая","четвертина","четвертинка","четвертичные","четвёртка","четвертная","четвертной","четвертование","четвертушечка","четвертушка","четвёртый","четверть","четвертьфинал","чётка","чётки","чёткость","чётность","четыре","четырёхголосие","четырёхжаберные","четырёхклассник","четырёхклассница","четырёхлетие","четырёхлетка","четырёхлеток","четырёхполье","четырёхсотая","четырёхсотлетие","четырёхсотый","четырёхтысячная","четырёхтысячный","четырёхугольник","четырёхчасовой","четырнадцатая","четырнадцатилетие","четырнадцатый","четьи-минеи","чех","чехарда","чехи","чехол","чехольчик","чехонь","чечевица","чечевичка","чечен","чеченец","чеченка","чеченцы","чечены","чечет","чечётка","чешка","чешуекрылые","чешуйка","чешуйчатость","чешуя","чибис","чивикание","чигирь","чиж","чижик","чижовка","чизелевание","чизель","чий","чикание","чикчиры","чилибуха","чилига","чилизник","чиликание","чилим","чиляга","чин","чина","чинар","чинара","чинка","чинность","чиновник","чиновница","чиновничек","чиновничество","чиновничишка","чиновнишко","чиновность","чинодрал","чинолюбие","чиноначалие","чиноначальник","чиноначальство","чиноположение","чинопочитание","чинопроизводство","чинуша","чины","чипсы","чирей","чирёнок","чирик","чирикание","чирики","чиркание","чирки","чирок","чирус","чирута","чирутка","чируха","чирышек","чиряк","численник","численность","числитель","числительное","числительность","число","чистенький","чистёха","чистец","чистик","чистиковые","чистилище","чистилка","чистильщик","чистильщица","чиститель","чистка","чистовая","чистовик","чистоган","чистоганчик","чистое","чистокровка","чистокровность","чистописание","чистописатель","чистоплотность","чистоплюй","чистоплюйка","чистоплюйство","чистополье","чистопородность","чистопсовость","чистосердечие","чистосердечность","чистосортность","чистота","чистотел","чистые","чистюлька","чистюля","чистяк","читабельность","читаемое","читаемость","читалка","читальня","читальщик","читатель","читательница","читка","чифирь","чих","чихание","чихирь","чихота","чичероне","чичисбей","чищение","член","членение","членик","членистоногие","членистость","членистые","членкор","членовредитель","членовредительница","членовредительство","членораздельность","членство","члены","чмокание","чоглок","чокание","чомга","чопорности","чопорность","чох","чоха","чреватая","чреватость","чрево","чревовещание","чревовещатель","чревовещательница","чревосечение","чревоугодие","чревоугодник","чревоугодница","чревоугодничество","чреда","чрезвычайность","чрезмерность","чресла","чресседельник","чтение","чтения","чтец","чтиво","чтитель","чтица","чуб","чубарый","чубик","чубук","чубучок","чубушник","чубчик","чувал","чуваш","чуваши","чувашка","чувства","чувственник","чувственница","чувственность","чувствилище","чувствительность","чувство","чувствование","чувяк","чувяки","чувячник","чугун","чугунка","чугунок","чугунолитейщик","чугуноплавильщик","чугунчик","чугунщик","чудак","чудаковатость","чудачества","чудачество","чудачина","чудачка","чудачок","чудесник","чудесница","чудесное","чудесность","чудик","чудила","чудище","чудная","чудное","чудной","чудо","чудовище","чудовищность","чудодей","чудодейка","чудодейственность","чудодействие","чудо-печка","чудотворение","чудотворец","чудотворство","чудо-юдо","чудь","чужак","чужачка","чужая","чужбина","чужбинка","чуждость","чужевластие","чужеземец","чужеземка","чужеземное","чужеземность","чужеземщина","чужеплеменник","чужеплеменница","чужеродец","чужеродка","чужестранец","чужестранка","чужое","чужой","чуйка","чукча","чукчанка","чукчи","чулан","чуланчик","чулки","чулок","чулочек","чулочки","чулочник","чулочница","чулчишки","чулчишко","чулюкание","чум","чума","чумазая","чумазый","чумак","чумачество","чумичка","чумная","чумной","чумовая","чумовой","чуни","чунька","чуньки","чуня","чуприна","чупрун","чур","чурбак","чурбан","чурбанчик","чурбачок","чурбашек","чурбашка","чурек","чурка","чурочка","чуткость","чутьё","чуфыкание","чуфыркание","чуфыскание","чуха","чухна","чухонец","чухонка","чухоночка","чухонцы","чучело","чучельник","чучельщик","чушка","чушки","чушь","шабат","шабашка","шабашник","шабашница","шабер","шабёр","шабли","шаблон","шаблонизация","шаблонизирование","шаблонность","шаблончик","шаблонщик","шабот","шабрение","шабрование","шабровка","шабровщик","шабур","шавка","шавочка","шаг","шаги","шагистика","шагомер","шагренирование","шагрень","шаечка","шажище","шажок","шажочек","шайба","шайбочка","шайка","шайка-лейка","шайтан","шакал","шакалёнок","шала","шаланда","шаландщик","шалаш","шалашик","шалбер","шалберник","шале","шалёвка","шалман","шаловливость","шаловство","шалон","шалоник","шалонник","шалопай","шалопайничество","шалопайство","шалопут","шалопутство","шалопуты","шалость","шалтай-болтай","шалун","шалунишка","шалунья","шалфей","шалыган","шаль","шальвары","шалька","шаман","шаманизм","шаманист","шаманка","шаманство","шаматон","шамбелян","шамбертен","шамберьер","шамкание","шамовка","шамот","шампанизация","шампанист","шампанское","шампань","шампиньон","шампунь","шампур","шандал","шанежка","шанец","шанжан","шанкр","шанс","шансик","шансон","шансонетка","шансонье","шантаж","шантажист","шантажистка","шантан","шантрапа","шантрет","шанц","шаньга","шапито","шапка","шапка-невидимка","шапочка","шапочки","шапочник","шапочница","шапчонка","шар","шарабан","шарада","шарахание","шарж","шаржирование","шаржировка","шаржист","шариат","шаривари","шарик","шарики","шарикоподшипник","шаркание","шаркун","шарлатан","шарлатанизм","шарлатанка","шарлатанство","шарлах","шарлот","шарлотка","шарм","шарманка","шарманочка","шарманщик","шарманщица","шарнир","шароварчики","шаровары","шаровидность","шаровка","шаромыга","шаромыжник","шаромыжница","шаромыжничество","шарообразность","шаропилот","шарошка","шарпальщик","шартрез","шарф","шарфик","шары","шасла","шассе","шасси","шасталка","шастание","шатание","шатающийся","шатен","шатенка","шатёр","шатёрщик","шатия","шаткость","шато-икем","шатун","шатунья","шафер","шаферство","шафран","шах","шахер-махер","шахермахерство","шахиншах","шахиншахиня","шахиня","шахматист","шахматистка","шахматка","шахматница","шахматы","шахта","шахтёр","шахтёрка","шахтовладелец","шахточка","шашечка","шашечница","шашист","шашистка","шашка","шашки","шашлык","шашлычная","шашлычник","шашлычок","шашни","шваб","швабка","швабра","швабы","шваль","швальная","швальня","шванк","шваркание","швартов","швартование","швартовка","швед","шведка","шведы","швейка","швейная","швейник","швейница","швейцар","швейцарец","швейцарка","швейцарская","швейцарцы","швейцарша","швеллер","шверт","швертбот","швец","швея","швырок","швырялка","швыряние","шебарша","шебаршение","шебека","шебуршание","шебуршение","шевалье","шевеление","шевелюра","шевиот","шеврет","шевро","шеврон","шедевр","шезлонг","шейк","шейка","шейкер","шейпинг","шейх","шелёвка","шелеп","шелепуга","шелепуги","шелепы","шелест","шелестение","шёлк","шелка","шелковина","шелковинка","шелковистость","шелковица","шелковка","шелковод","шелководка","шелководство","шелковьё","шёлкокручение","шёлкомотальная","шёлкомотальня","шёлкомотальщик","шёлкомотальщица","шёлкомотание","шелкопряд","шёлкопрядение","шёлкопрядильня","шёлкопрядильщик","шёлкопрядильщица","шёлкоткачество","шеллак","шеллингианец","шеллингианство","шеллингист","шелом","шелоник","шелонник","шелопай","шелопут","шелопуты","шелуди","шелудивая","шелудивость","шелудивый","шелуха","шелушение","шелушинка","шельма","шельмёнок","шельмец","шельмование","шельмоватость","шельмовка","шельмовство","шельмочка","шельтердек","шельф","шелюга","шелюгование","шемая","шемизетка","шен","шенапан","шенкель","шепелеватость","шепелявение","шепелявость","шепелявый","шёпот","шепотня","шепоток","шептала","шептание","шептун","шептунья","шептуха","шербет","шеренга","шериф","шерл","шероховатости","шероховатость","шерочка","шерп","шерпа","шерпка","шерпы","шерстевед","шерстеведение","шерстезаготовка","шерстемойка","шерстемойня","шерстемойщик","шерстемойщица","шерстепрядение","шерстепрядильня","шерстепрядильщик","шерстепрядильщица","шерстечесалка","шерстечесальня","шерстечесальщик","шерстечесальщица","шерстина","шерстинка","шерстистость","шёрстка","шёрстность","шерстобит","шерстобитня","шерстобой","шерстобойка","шерстобойня","шерстовед","шерстоведение","шерстокрыл","шерстомой","шерстомойка","шерстомойня","шерстомойщик","шерстопрядение","шерстопрядильня","шерстопрядильщик","шерстопрядильщица","шерстоткачество","шерсточесалка","шерсточесальня","шерсточесальщик","шерсточесальщица","шерсть","шерстяник","шерстянка","шертинг","шерхебель","шершавость","шершебка","шершебок","шершень","шест","шестая","шествие","шествование","шестерёнка","шестерёночка","шестерик","шестёрка","шестерня","шестёрочка","шестиборец","шестиборье","шестидесятая","шестидесятилетие","шестидесятник","шестидесятники","шестидесятница","шестидесятый","шестидневка","шестик","шестиклассник","шестиклассница","шестилетие","шестилетка","шестилеток","шестиполье","шестисотая","шестисотлетие","шестисотый","шеститысячная","шеститысячный","шестиугольник","шестичасовой","шестнадцатая","шестнадцатилетие","шестнадцатый","шестовик","шестовой","шестой","шесток","шестопёр","шестопсалмие","шеф","шефство","шея","шибер","шибздик","Шива","шиворот","шизик","шизогония","шизофреник","шизофреничка","шизофрения","шиизм","шиит","шиитка","шик","шикание","шикарность","шиллинг","шило","шилоклювка","шилохвостка","шилохвость","шильник","шильничество","шильце","шимми","шимоза","шимпанзе","шина","шингард","шинелёнка","шинелишка","шинель","шинелька","шинельная","шинкарка","шинкарство","шинкарь","шинкование","шинковка","шинок","шиншилла","шиньон","шип","шипение","шиповник","шиповничек","шипок","шипорез","шипун","шипунья","шипучее","шипучесть","шипучка","шипы","шипящий","ширение","ширина","ширинка","ширма","ширмы","широкий","широковещание","широковещательность","ширококолейка","широколиственные","широконоска","широкорот","широкость","широта","широты","ширпотреб","ширь","шитво","шитик","шитьё","шифер","шифон","шифоньер","шифоньерка","шифоньерочка","шифр","шифратор","шифровальная","шифровальщик","шифровальщица","шифрование","шифровка","шифровщик","шифровщица","шифрограмма","шихта","шихтовальщик","шихтование","шихтовка","шихтовщик","шиш","шишак","шишачок","шишельник","шишельница","шишечка","шишига","шишимора","шишка","шишкобой","шишковатость","шишконосные","шкала","шкалик","шкальчик","шканечный","шканцы","шкаторина","шкатула","шкатулка","шкатулочка","шкатулочник","шкаф","шкафик","шкафут","шкафчик","шквал","шквара","шкварка","шкварки","шкворень","шкентель","шкерт","шкет","шкив","шкипер","шкиперская","шкода","школа","школение","школьник","школьница","школьничание","школьничество","школяр","школярство","шкот","шкотовый","шкура","шкурка","шкурник","шкурничество","шкуродёр","шкурочка","шкурьё","шкурятник","шлаг","шлагбаум","шлак","шлакобетон","шлакоблок","шлакование","шлаковик","шлаковина","шлаковщик","шлаковый","шлам","шланг","шлафор","шлафрок","шлёвка","шлейка","шлейф","шлейфование","шлем","шлемофон","шлёнда","шлёндра","шлёнка","шлёпанец","шлёпание","шлёпанцы","шлёпка","шлепок","шлепотня","шлея","шлир","шлиф","шлифовальник","шлифовальщик","шлифовальщица","шлифование","шлифовка","шлифовщик","шлифовщица","шлифтик","шлих","шлихта","шлихтик","шлихтовальщик","шлихтовальщица","шлихтование","шлихтовка","шлиц","шлица","шлицы","шлык","шлычка","шлычок","шлюз","шлюзование","шлюзовик","шлюп","шлюпбалка","шлюпка","шлюпочка","шлюпочник","шлюпочный","шлюпчонка","шлюха","шлягер","шлямбур","шляпа","шляпка","шляпник","шляпница","шляпочка","шляпочник","шляпочница","шлях","шляхетство","шляхта","шляхтич","шляхтянка","шмат","шматок","шмель","шмоль","шмольник","шмольница","шмуцтитул","шмыгание","шмякание","шнапс","шнек","шнека","шнеллер","шницель","шнур","шнурование","шнуровка","шнурок","шнурочек","шныряние","шнява","шняка","шов","шовинизм","шовинист","шовинистка","шовчик","шок","шоколад","шоколадка","шоколадник","шоколадница","шомпол","шомполка","шоп-тур","шоркание","шорная","шорник","шорницкая","шорничество","шорня","шорох","шорт-трек","шорты","шоры","шоссе","шоссеец","шотландец","шотландка","шотландцы","шоу","шоумен","шофёр","шофёришка","шоферня","шофёрство","шпага","шпагат","шпагатик","шпагоглотатель","шпажист","шпажистка","шпажка","шпажонка","шпак","шпаклевание","шпаклёвка","шпаклёвочка","шпаклёвщик","шпаклёвщица","шпала","шпалера","шпалерник","шпалеры","шпалорезка","шпалы","шпальник","шпана","шпангоут","шпандырь","шпанка","шпаргалка","шпаргалочник","шпаргалочница","шпарение","шпат","шпатель","шпаты","шпахтель","шпация","шпенёк","шпигат","шпиговка","шпик","шпикачка","шпикачки","шпиль","шпильё","шпилька","шпильки","шпильман","шпинат","шпингалет","шпиндель","шпинель","шпион","шпионаж","шпионишка","шпионка","шпионство","шпиончик","шпиц","шпицрутен","шпицрутены","шплинт","шплинтование","шплинтовка","шпон","шпонка","шпор","шпора","шпорец","шпорник","шпорца","шпринцевание","шпринцовка","шприц","шприцевание","шприцовка","шприцовщик","шприцовщица","шпрот","шпрота","шпротина","шпротинка","шпроты","шпулька","шпульник","шпульница","шпуля","шпунт","шпунтина","шпунтование","шпунтовка","шпунтубель","шпур","шпынь","шпыняние","шрам","шрамик","шрамина","шрапнель","шрапнелька","шримс","шрифт","шрифтист","шрифтовик","шрот","штаб","штабелевание","штабелёвка","штабелёк","штабелеукладчик","штабелирование","штабель","штабист","штаб-квартира","штаб-лекарь","штабник","штабной","штаб-офицер","штаб-ротмистр","штабс-капитан","штабс-ротмистр","штаг","штадив","штакетина","штакетник","штакор","шталмейстер","штамб","штамм","штамп","штампование","штамповка","штамповщик","штамповщица","штанга","штанген","штангенциркуль","штангист","штангистка","штандарт","штаники","штанина","штанишки","штаны","штапель","штапик","штат","штатгальтер","штатив","штатный","штатский","штатское","штаты","штафирка","штевень","штейгер","штейн","штемпелевание","штемпель","штепсель","штиблета","штиблетина","штиблетишка","штиблетишки","штиблетка","штиблетки","штиблеты","штивка","штилевание","штиль","штирборт","штифт","штифтик","штихель","шток","штокроза","штокфиш","штокфишник","штоленка","штольня","штопальня","штопальщик","штопальщица","штопание","штопка","штопор","штопорение","штопорик","штора","шторка","шторм","штормик","штормовка","штормтрап","штос","штосс","штоф","штофик","штофная","штофчик","штраб","штраба","штраф","штрафная","штрафник","штрафной","штрафование","штрафованный","штрафовка","штрейкбрехер","штрейкбрехерство","штрек","штрипка","штрих","штрихование","штриховка","штришок","штрудель","штудирование","штудировка","штудия","штука","штукарка","штукарство","штукарь","штукатур","штукатурение","штукатурка","штукатурщик","штукатурщица","штукенция","штукмейстер","штукование","штуковина","штуковинка","штуковка","штуковщик","штуковщица","штунда","штундизм","штундист","штундистка","штурвал","штурвальная","штурвальный","штурвальчик","штурм","штурман","штурманская","штурманство","штурмование","штурмовик","штурмовка","штурмовщина","штурмующий","штуртрос","штуф","штуцер","штуцерник","штуцерный","штучка","штучник","штучница","штыб","штык","штыка","штык-болт","штыки","штыкование","штыковка","штык-юнкер","штылёк","штырёк","штырь","шу","шуба","шубеечка","шубейка","шубёнка","шубища","шубка","шубник","шуга","шугай","шугание","шуйца","шулер","шулеришка","шулерство","шум","шумиха","шумливость","шумовик","шумовка","шумок","шумы","шунгит","шурин","шуркание","шурование","шуровка","шуровщик","шурпа","шурум-бурум","шуруп","шурупчик","шурф","шурфование","шурфовка","шурхание","шуршание","шуры-муры","шуряк","шуст","шустрость","шустряга","шустряк","шут","Шут","шутейник","шутейность","шутёнок","шутила","шутиха","шутка","шутливость","шутник","шутница","шутовка","шутовство","шуточка","шуточное","шуточность","шушваль","шушвара","шушера","шушпан","шушукание","шушун","шушунишко","шушунчик","шхеры","шхуна","щавелёк","щавелинка","щавель","щавельник","щебёнка","щебёночка","щебёнщик","щебень","щебет","щебетание","щебетня","щебетун","щебетунья","щебетуха","щебетушечка","щебетушка","щебнебоец","щебрец","щеврица","щеглёнок","щеглиха","щегловка","щегол","щеголеватость","щеголёк","щеголиха","щёголь","щегольство","щеголяние","щедролюбие","щедрость","щедроты","щека","щекастая","щекастый","щёки","щековина","щеколда","щеколдочка","щёкот","щекотание","щекотка","щекотливость","щелевой","щелинка","щелистость","щёлка","щёлкальщик","щёлкальщица","щёлкание","щелкопёр","щелкопёрство","щелкотня","щелкун","щелкунчик","щелкушка","щёлок","щелоковар","щелоктание","щелочение","щёлочка","щёлочность","щёлочь","щелчок","щель","щемление","щенение","щенок","щеночек","щенчишка","щепа","щепание","щепетильность","щепка","щепотка","щепотник","щепоточка","щепоть","щепочка","щепьё","щерба","щербина","щербинка","щетина","щетинка","щетинки","щетинник","щетинозуб","щетинщик","щётка","щеткодержатель","щёточка","щёточник","щёточница","щёчка","щи","щиколка","щиколотка","щипальщик","щипальщица","щипание","щипец","щипка","щипковые","щиповка","щипок","щипцы","щипчики","щирица","щит","щитень","щитик","щитни","щитник","щитовка","щитовник","щиток","щитомордник","щитоносец","щитоноска","щишки","щука","щуковые","щукообразные","щуп","щупальца","щупальце","щупание","щупик","щур","щурёнок","щурка","щучина","щучка","эбен","эбеновые","эбонит","эвакогоспиталь","эвакоприёмник","эвакопункт","эвакуатор","эвакуация","эвакуированная","эвакуированный","эвдемонизм","эвдемонист","эвен","эвенк","эвенка","эвенки","эвенкийка","эвены","эвикция","эвкалипт","эвклаз","эвкоммия","Эвменида","Эвмениды","эволюции","эволюционизм","эволюционирование","эволюционист","эволюционистка","эволюция","эвристика","эвфемизм","эвфоника","эвфония","эвфуизм","эгалитаризм","эгалитарист","эгида","эгоизм","эгоист","эгоистичность","эгоистка","эготизм","эгофутуризм","эгофутурист","эгофутуристка","эгоцентризм","эгоцентрист","эгоцентристка","эгрет","эгретка","эдельвейс","эдем","эдикт","эдил","эдиция","эжектор","эжекция","эзофагоскоп","экание","экарте","эквадорец","эквадорка","эквадорцы","экватор","экваториал","эквивалент","эквивалентность","эквивокация","эквилибрирование","эквилибрист","эквилибристика","эквилибристка","экер","экзальтация","экзальтированность","экзамен","экзаменатор","экзаменация","экзаменующаяся","экзаменующийся","экзарх","экзархат","экзекватура","экзекутор","экзекуция","экзема","экземпляр","экземплярец","экземплярчик","экзерсис","экзерциргауз","экзерциции","экзерциция","экзистенциализм","экзистенциалист","экзистенциалистка","экзобиология","экзогамия","экзот","экзотизм","экзотика","экзотичность","экивок","экивоки","экилибр","экипаж","экипажец","экипажная","экипажный","экипирование","экипировка","эклампсия","эклектизм","эклектик","эклектика","эклектицизм","эклектичность","эклер","эклиметр","эклиптика","эклога","экогенез","эколог","экология","эконом","экономайзер","экономгеография","экономизация","экономизирование","экономизм","экономика","экономист","экономистка","экономичность","экономия","экономка","экономность","экономщик","экосез","экосистема","экоцид","экран","экранизация","экранизирование","экранирование","экранировка","эксгаустер","эксгумация","эксикатор","экскаватор","экскаваторостроение","экскаваторщик","экскавация","экскременты","экскреты","экскреция","экскурс","экскурсант","экскурсантка","экскурсия","экскурсовод","экскурсоводка","экслибрис","экспансивность","экспансионизм","экспансионист","экспансия","экспатриант","экспатриантка","экспатриация","экспедирование","экспедитор","экспедиторша","экспедиционер","экспедиция","эксперимент","эксперименталист","эксперименталистка","эксперименталка","экспериментатор","экспериментаторство","экспериментирование","эксперт","экспертиза","экспирация","эксплантация","экспликация","эксплуататор","эксплуататорка","эксплуататорство","эксплуататорша","эксплуатационник","эксплуатация","эксплуатирование","экспозе","экспозиметр","экспозиция","экспонат","экспонент","экспонирование","экспонометр","экспорт","экспортёр","экспортирование","экспресс","экспресс-анализ","экспрессивность","экспрессионизм","экспрессионист","экспрессионистка","экспрессия","экспромт","экспроприатор","экспроприация","экссудат","экссудация","экстаз","экстемпорале","экстемпоралия","экстенсивность","экстерн","экстернат","экстернка","экстерриториальность","экстерьер","экстирпатор","экстирпация","экстра","экстравагантность","экстрагирование","экстрадиция","экстракт","экстрактивность","экстрактор","экстракция","экстраординарность","экстраполирование","экстраполяция","экстрема","экстремизм","экстремист","экстремистка","экстренности","экстренность","эксцентриада","эксцентризм","эксцентрик","эксцентрика","эксцентричность","эксцесс","эктипография","эктопаразит","эктопаразиты","экю","эластик","эластин","эластичность","эластомер","элеватор","элеваторщик","элевация","элегантность","элегист","элегичность","элегия","электорат","электризация","электрик","электрификатор","электрификация","электричество","электричка","электроакустика","электроаппарат","электроаппаратура","электроарматура","электробритва","электробур","электробурение","электробурильщик","электробус","электровибратор","электровоз","электрогитара","электрод","электродвигатель","электродвижок","электродержатель","электродинамика","электродоение","электродойка","электродоилка","электродрель","электродренаж","электродуга","электроёмкость","электрозакалка","электрозащита","электроинструмент","электроискра","электрокамин","электрокар","электрокардиограмма","электрокардиограф","электрокардиография","электрокарщик","электрокарщица","электрокорунд","электролампа","электролампочка","электролиз","электролизёр","электролизник","электролиния","электролит","электролюминесценция","электромагнетизм","электромагнит","электромегафон","электрометр","электрометрия","электромобиль","электромонтаж","электромонтажник","электромонтажница","электромонтёр","электромотор","электрон","электронаркоз","электроника","электрооборудование","электрооптика","электроосветитель","электроосвещение","электропатрон","электропаяльник","электропередача","электропила","электропилка","электропильщик","электропитание","электроплавильщик","электроплавка","электроплита","электроплитка","электроподстанция","электропоезд","электрополировка","электрополотёр","электропредохранитель","электроприбор","электропривод","электропровод","электропроводимость","электропроводка","электропроводность","электропрогрев","электропроигрыватель","электропунктура","электроразведка","электрорезка","электрорезчик","электрорубанок","электросварка","электросварочная","электросварщик","электросварщица","электросверло","электросвет","электросеть","электросинтез","электроскоп","электроснабжение","электросталь","электростанция","электростатика","электростимуляция","электросчётчик","электротерапия","электротермист","электротермия","электротехник","электротехника","электроток","электротранспорт","электротяга","электрофизиология","электрофильтр","электрохимик","электрохимия","электроход","электрохозяйство","электрошнур","электроэнергия","электрум","элемент","элементарность","элементы","элерон","элероны","элефантиазис","Элизий","Элизиум","элизия","эликсир","элиминация","элиминирование","элинвар","элита","элитаризм","элитарность","элитра","элитры","эллин","эллинг","эллинизм","эллинист","эллинистка","эллинка","эллиноман","эллинофил","эллинство","эллины","эллипс","эллипсис","эллипсность","эллипсоид","эллиптичность","элодея","элоквенция","эль","эльдорадо","Эльдорадо","эльзевир","эльф","элювий","эмалирование","эмалировка","эмалировщик","эмалировщица","эмалит","эмаль","эмальер","эманация","эмансипатор","эмансипационист","эмансипация","эмансипе","эмбарго","эмблема","эмболия","эмбриогенез","эмбриолог","эмбриология","эмбрион","эмеритура","эмигрант","эмигрантка","эмигрантство","эмиграция","эмир","эмират","эмиритон","эмиссар","эмиссарство","эмиссия","эмитент","эмка","эммер","эмоции","эмоциональность","эмоция","эмочка","эмпиреи","эмпирей","эмпиризм","эмпирик","эмпирика","эмпириокритик","эмпириокритицизм","эмпириомонизм","эмпириомонист","эмпириосимволизм","эмпириосимволист","эмпиричность","эмпирия","эму","эмульгатор","эмульгирование","эмульсирование","эмульсия","эмфаза","эмфизема","энгармонизм","эндемизм","эндемик","эндемики","эндемия","эндогамия","эндокард","эндокардит","эндокринолог","эндокринология","эндокринопатия","эндоскоп","эндоскопия","эндотоксин","эндотоксины","эндшпиль","энеолит","энергетизм","энергетик","энергетика","энергичность","энергия","энерговооружённость","энергоёмкость","энергопоезд","энергосистема","энергостроительство","энженю","энзим","энзимы","энзоотия","энигма","энигматичность","энкаустика","энклитика","энотера","энтазис","энтерит","энтероколит","энтомолог","энтомологист","энтомология","энтомофилия","энтропия","энтузиазм","энтузиаст","энтузиастичность","энтузиастка","энцефалит","энцефалограмма","энцефалография","энцефалопатия","энциклика","энциклопедизм","энциклопедист","энциклопедистка","энциклопедисты","энциклопедичность","энциклопедия","Эол","эолит","эпатаж","эпатирование","эпентеза","эпигон","эпигонство","эпиграмма","эпиграмматист","эпиграмматистка","эпиграммист","эпиграф","эпиграфика","эпиграфист","эпиграфистка","эпидемиолог","эпидемиология","эпидемия","эпидерма","эпидермис","эпидермофития","эпидиаскоп","эпизод","эпизодец","эпизодик","эпизодичность","эпизоотик","эпизоотия","эпизоотология","эпик","эпика","эпикард","эпикриз","эпикуреец","эпикуреизм","эпикуреист","эпикурейство","эпилепсия","эпилептик","эпилептичка","эпилог","эпилятор","эпиляциция","эпископ","эпистемология","эпистиль","эпистола","эпистолярий","эпиталама","эпитафия","эпителий","эпитет","эпифауна","эпифиз","эпифит","эпифиты","эпифора","эпицентр","эпицикл","эпичность","эполемент","эполет","эполетик","эполеты","эпонж","эпопея","эпос","эпоха","эпохальность","эпсилон","эпулис","эпюр","эра","Эрата","Эрато","эрг","эргограф","эргометр","эрдельтерьер","эре","эрекция","эретизм","эрзац","эрзя","эрзяне","Эринии","Эриния","эристика","эритема","эритроцит","эритроциты","эркер","Эрмитаж","эрмитаж","эрозия","эрос","Эрос","Эрот","эротизм","эротик","эротика","эротичность","эротоман","эротомания","эротоманка","эрстед","эрудированность","эрудит","эрудитка","эрудиция","эрцгерцог","эрцгерцогиня","эрцгерцогство","эсер","эсерка","эсеровщина","эсерство","эскадра","эскадрилья","эскадрон","эскадронец","эскадронный","эскалатор","эскалация","эскалоп","эскамотаж","эскамотирование","эскапада","эскарп","эскарпирование","эсквайр","эскиз","эскизность","эскимо","эскимос","эскимоска","эскимосы","эскорт","эскортирование","эскудо","Эскулап","эскулап","эсминец","эспада","эспадрон","эспадронист","эспандер","эспаньолка","эспарцет","эсперантист","эсперантистка","эсперанто","эспланада","эспри","эссе","эссеист","эссенция","эст","эстакада","эстамп","эстафета","эстезиология","эстет","эстетизация","эстетизм","эстетик","эстетика","эстетичность","эстетка","эстетное","эстетность","эстетство","эстокада","эстонец","эстонка","эстонцы","эстрагон","эстрада","эстрадник","эстрадница","эстрадность","эстуарий","эсты","эсхатология","эсэсовец","эта","этаж","этажерка","этажерочка","этажность","эталон","эталонирование","этан","этап","этапирование","этапник","этапный","этернит","этика","этикет","этикетаж","этикетирование","этикетировка","этикетировщик","этикетировщица","этикетка","этикетчик","этикетчица","этил","этилен","этимолог","этимологизация","этимологизирование","этимология","этимон","этиолирование","этиология","этиоляция","этичность","этнарх","этногенез","этнограф","этнографизм","этнография","этнолог","этнология","этноним","этнонимика","этнонимия","этнос","это","этот","этруск","этруска","этруски","этуаль","этюд","этюдик","этюдист","этюдник","этюдность","эустресс","эфа","эфедра","эфедрин","эфемер","эфемерида","эфемериды","эфемерность","эфемероид","эфенди","эфес","эфиоп","эфиопка","эфиопы","эфир","эфиризация","эфирность","эфироман","эфиромания","эфироманка","эфиронос","эфор","эффект","эффективность","эффектничание","эффектность","эффекты","эффузия","эхин","эхинококк","эхинококкоз","Эхо","эхо","эхолот","эшарп","эшафот","эшелон","эшелонирование","эшинит","эякуляция","юань","юбилей","юбиляр","юбилярша","юбка","юбочка","юбочник","юбочница","юбчонка","ювелир","ювеналии","Ювента","юг","Юг","юго-восток","юго-запад","югослав","югославка","югославы","Югра","югрич","югричи","югурт","юдаизм","юдоль","юдофил","юдофильство","юдофоб","юдофобство","южане","южанин","южанка","южноамериканец","южноамериканка","южноамериканцы","юз","юзист","юзистка","юкагир","юкагирка","юкагиры","юкка","юкола","юла","юление","юлка","юмор","юмореска","юморист","юмористика","юмористка","юморок","юнак","юнаки","юнга","юнец","юниор","юниорка","юница","юнкер","юнкерство","юнкор","юнкорка","юннат","юность","юноша","юношество","Юпитер","юпитер","юр","юра","юрага","юридизация","юрисдикция","юрисконсульт","юрисконсультство","юриспрудент","юриспруденция","юрист","юркость","юрод","юродивая","юродивец","юродивость","юродивый","юродство","юродствование","юрок","юрт","юрта","юртёнка","юс","юстирование","юстировка","юстировщик","юстиция","ют","юферс","юферсы","юфта","юфть","юхта","ююба","ябеда","ябедник","ябедница","ябедничание","ябедничество","яблоко","яблоневые","яблонник","яблоновка","яблонька","яблоня","яблочко","яблочник","яблочница","яванец","яванка","яванцы","явка","явление","явленьице","явнобрачные","явор","явственность","явь","яга","ягдташ","ягель","ягельник","ягнение","ягнёнок","ягнёночек","ягнятина","ягнятник","ягода","ягодина","ягодица","ягодицы","ягодка","ягодковые","ягодник","ягодница","ягуар","яд","ядовитость","ядозуб","ядозубы","ядохимикат","ядохимикаты","ядрёность","ядрица","ядро","ядрышко","ядь","язва","язвенник","язвина","язвинка","язвитель","язвительность","язвочка","язик","язык","языкоблудие","языкоблудство","языковед","языковедение","языкознание","языкотворец","языкотворчество","языкоучение","язычество","язычишко","язычище","язычковые","язычковый","язычник","язычница","язычок","язь","яйла","яйцевод","яйцеед","яйцезаготовка","яйцеклад","яйцекладка","яйцеклетка","яйценоскость","яйцерождение","яйцо","яичко","яичник","яичница","яишенка","яишня","як","якание","якающая","якающий","якобинец","якобинизм","якобинство","якорёк","якорец","якорница","якорь","якут","якутёнок","якутка","якуты","якшание","ял","ялик","яличник","яловица","яловка","яловость","яломок","ям","яма","ямайское","ямб","ямина","яминка","ямища","ямка","ямокопатель","ямочка","ямочки","ямщик","ямщичество","ямщичка","ямщичок","январь","яндова","янки","янсенизм","янсенист","янтарчик","янтарь","Янус","янус","янычар","янычары","японец","японист","японистика","японистка","японка","японовед","японоведение","японцы","яр","яранга","ярд","ярем","ярица","ярка","яркость","ярлыга","ярлык","ярлычок","ярмарка","ярмо","яровизация","яровина","яровинка","яровище","яроводье","яровое","яровые","ярость","ярочка","яруга","яружек","ярунок","ярус","ярусность","ярутка","ярыга","ярыжка","ярыжник","ярыжный","ярь","ярь-медянка","яс","ясак","ясачник","ясельничий","ясенец","ясень","ясколка","ясли","ясли-сад","ясменник","ясновидение","ясновидец","ясновидица","ясновидящая","ясновидящий","ясноглазая","ясноглазый","ясноокая","ясноокий","ясность","яснотка","ясочка","яспис","яства","яствие","яство","ястреб","ястребёнок","ястребинка","ястребок","ястребятник","ястык","ясы","ясынька","ясырь","ятаган","ятовь","ятовье","ятрышник","ять","яхонт","яхонтик","яхта","яхт-клуб","яхтклубовец","яхтовладелец","яхточка","яхтсмен","яхтсменка","ячейка","ячеистость","ячёнок","ячество","ячея","ячменка","ячменник","ячмень","ячневик","яшма","ящер","ящерёнок","ящерица","ящерка","ящеры","ящик","ящичек","ящичник","ящур","ящурка"] \ No newline at end of file diff --git a/base/BaseCommand.js b/base/BaseCommand.js index e60989b9..03d8df3d 100644 --- a/base/BaseCommand.js +++ b/base/BaseCommand.js @@ -20,7 +20,7 @@ class BaseCommand { */ this.ownerOnly = options.ownerOnly || false; /** - * @type {Object} + * @type __dirname */ this.dirname = options.dirname || false; /** diff --git a/base/JaBa.js b/base/JaBa.js index 00927e07..7de8e4ed 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -120,10 +120,9 @@ class JaBa extends Client { /** * * @param {String} dir - * @param {String} guild_id * @returns */ - async loadCommands(dir, guild_id) { + async loadCommands(dir) { const filePath = path.join(__dirname, dir); const files = await fs.readdir(filePath); const rest = new REST({ version: "9" }).setToken(this.config.token); @@ -132,7 +131,8 @@ class JaBa extends Client { for (let index = 0; index < files.length; index++) { const file = files[index]; const stat = await fs.lstat(path.join(filePath, file)); - if (stat.isDirectory()) this.loadCommands(path.join(dir, file), guild_id); + if (stat.isDirectory()) this.loadCommands(path.join(dir, file)); + if (file.endsWith(".js")) { const Command = require(path.join(filePath, file)); if (Command.prototype instanceof BaseCommand) { @@ -148,7 +148,7 @@ class JaBa extends Client { }); } - if (command.guildOnly) guild_commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + if (!this.config.production) guild_commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); else commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); @@ -158,24 +158,90 @@ class JaBa extends Client { } try { - if (guild_id && guild_id.length) { + if (!this.config.production) { await rest.put( - Routes.applicationGuildCommands(this.config.user, guild_id), { + Routes.applicationGuildCommands(this.config.user, this.config.support.id), { body: guild_commands - }, + } + ); + } else { + await rest.put( + Routes.applicationCommands(this.config.user), { + body: commands + } ); } - await rest.put( - Routes.applicationCommands(this.config.user), { - body: commands - }, - ); + this.logger.log("Successfully registered application commands."); } catch (err) { this.logger.log("Cannot load commands: " + err.message, "error"); } } + /** + * + * @param {String} dir + * @param {String} file + */ + async loadCommand(dir, file) { + const commands = []; + const guild_commands = []; + const rest = new REST({ version: "9" }).setToken(this.config.token); + const Command = require(path.join(dir, `${file}.js`)); + if (Command.prototype instanceof BaseCommand) { + const command = new Command(this); + this.commands.set(command.command.name, command); + const aliases = []; + if (command.aliases && Array.isArray(command.aliases) && command.aliases.length > 0) { + command.aliases.forEach((alias) => { + const command_alias = command.command instanceof SlashCommandBuilder ? { ...command.command.toJSON() } : { ...command.command }; + command_alias.name = alias; + aliases.push(command_alias); + this.commands.set(alias, command); + }); + } + + if (!this.config.production) guild_commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + else commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + + if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); + this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`); + + try { + if (!this.config.production) { + await rest.put( + Routes.applicationGuildCommands(this.config.user, this.config.support.id), { + body: guild_commands + } + ); + } else { + await rest.put( + Routes.applicationCommands(this.config.user), { + body: commands + } + ); + } + + this.logger.log("Successfully registered application commands."); + } catch (err) { + this.logger.log("Cannot load commands: " + err.message, "error"); + } + + return; + } + } + + /** + * + * @param {String} dir + * @param {String} name + */ + async unloadCommand(dir, name) { + delete require.cache[require.resolve(`${dir}${path.sep}${name}.js`)]; + + return; + } + /** * * @param {String} dir diff --git a/commands/Owner/reload.js b/commands/Owner/reload.js new file mode 100644 index 00000000..bd533f5e --- /dev/null +++ b/commands/Owner/reload.js @@ -0,0 +1,58 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"), + BaseCommand = require("../../base/BaseCommand"), + i18next = require("i18next"), + autoUpdateDocs = require("../../helpers/autoUpdateDocs"); + +class Reload extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("reload") + .setDescription(client.translate("owner/reload:DESCRIPTION")) + .addStringOption(option => + option.setName("command") + .setDescription(client.translate("owner/reload:USAGE")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + interaction.deferReply({ ephemeral: true }); + + const command = interaction.options.getString("command"); + const cmd = client.commands.get(command); + if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { search: command }); + + await client.unloadCommand(`../commands/${cmd.category}`, cmd.command.name); + await client.loadCommand(`../commands/${cmd.category}`, cmd.command.name); + + i18next.reloadResources(["ru-RU", "uk-UA"]); + autoUpdateDocs.update(client); + + interaction.success("owner/reload:SUCCESS", { + command: cmd.command.name + }, { edit: true, ephemeral: true }); + } +} + +module.exports = Reload; \ No newline at end of file diff --git a/events/CommandHandler.js b/events/CommandHandler.js index d45253b0..fc41f735 100644 --- a/events/CommandHandler.js +++ b/events/CommandHandler.js @@ -31,7 +31,7 @@ class CommandHandler extends BaseEvent { const guildData = await client.findOrCreateGuild({ id: interaction.guildId }); - data.guildData = guildData; + interaction.guild.data = data.guildData = guildData; const memberData = await client.findOrCreateMember({ id: interaction.member.id, diff --git a/helpers/autoUpdateDocs.js b/helpers/autoUpdateDocs.js index 957d5e28..cb1f05fb 100644 --- a/helpers/autoUpdateDocs.js +++ b/helpers/autoUpdateDocs.js @@ -1,13 +1,12 @@ module.exports.update = function (client) { const table = require("markdown-table"), fs = require("fs"), - commands = client.commands, - categories = [], - length = [...new Map(commands.map(v => [v.constructor.name, v])).values()].length; + commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()], + categories = []; commands.forEach((cmd) => { if (!categories.includes(cmd.category)) categories.push(cmd.category); }); - let text = `# JaBa имеет **${length} ${client.getNoun(length, "команда", "команды", "команд")}** в **${categories.length} ${client.getNoun(categories.length, "категории", "категориях", "категориях")}**! \n\n#### Содержимое таблицы \n**Название**: Название команды \n**Описание**: Описание команды \n**Использование**: Использование команды ( [] - обязательно, () - необязательно ) \n**Разрешено использование**: Где можно использовать команду \n\n`; + let text = `# JaBa имеет **${commands.length} ${client.getNoun(commands.length, "команда", "команды", "команд")}** в **${categories.length} ${client.getNoun(categories.length, "категории", "категориях", "категориях")}**! \n\n#### Содержимое таблицы \n**Название**: Название команды \n**Описание**: Описание команды \n**Использование**: Использование команды ( [] - обязательно, () - необязательно ) \n**Разрешено использование**: Где можно использовать команду \n\n`; // categories.sort(function(a, b) { // const aCmdsSize = commands.filter((cmd) => cmd.category === a).size; // const bCmdsSize = commands.filter((cmd) => cmd.category === b).size; @@ -18,9 +17,9 @@ module.exports.update = function (client) { const categoriesArray = [ ["Название", "Описание", "Использование", "Разрешено использование"] ]; - const cmds = commands.filter((cmd) => cmd.category === cat), - length = [...new Map(cmds.map(v => [v.constructor.name, v])).values()].length; - text += `### ${cat} (${length} ${client.getNoun(length, "команда", "команды", "команд")})\n\n`; + const cmds = [...new Map(commands.filter((cmd) => cmd.category === cat).map(v => [v.constructor.name, v])).values()]; + + text += `### ${cat} (${cmds.length} ${client.getNoun(cmds.length, "команда", "команды", "команд")})\n\n`; cmds.sort(function (a, b) { if (a.command.name < b.command.name) return -1; else return 1; diff --git a/index.js b/index.js index 13873d65..129185de 100644 --- a/index.js +++ b/index.js @@ -12,7 +12,7 @@ const client = new JaBa({ client.translations = await require("./helpers/languages")(); await client.loadEvents("../events"); - await client.loadCommands("../commands", client.config.support.production ? "" : client.config.support.id); + await client.loadCommands("../commands"); await client.init(); })(); diff --git a/languages/ru-RU/administration/addcommand.json b/languages/ru-RU/administration/addcommand.json deleted file mode 100644 index 160aebe1..00000000 --- a/languages/ru-RU/administration/addcommand.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Создать свою команду!", - "USAGE": "addcommand [название] [ответ]", - "EXAMPLES": "addcommand hello Привет, {user}. Добро пожаловать на {guild}!", - "MISSING_NAME": "Укажите название команды!", - "MISSING_ANSWER": "Укажите ответ команды!", - "SUCCESS": "Команда **{{commandName}}** создана!" -} \ No newline at end of file diff --git a/languages/ru-RU/administration/delcommand.json b/languages/ru-RU/administration/delcommand.json deleted file mode 100644 index f7f4a691..00000000 --- a/languages/ru-RU/administration/delcommand.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Удалить свою команду!", - "USAGE": "delcommand [название]", - "EXAMPLES": "delcommand hello", - "MISSING_NAME": "Введите название команды!", - "UNKNOWN_COMMAND": "Команда {{commandName}} не существует!", - "SUCCESS": "Команда **{{commandName}}** была удалена с сервера!" -} \ No newline at end of file diff --git a/languages/ru-RU/economy/findwords.json b/languages/ru-RU/economy/findwords.json deleted file mode 100644 index 048bad96..00000000 --- a/languages/ru-RU/economy/findwords.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "DESCRIPTION": "Угадай загаданное мною слово!", - "USAGE": "findwords (STOP)", - "EXAMPLES": "findwords", - "INVALID_WORD": "{{member}} | Данное слово не существует или я его не знаю :(", - "GAME_STARTING": ":timer: | Игра начнётся через 10 секунд!\nНапишите STOP, если хотите остановить игру!", - "FIND_WORD": "20 секунд чтобы найти слово, в котором есть **{{word}}**!", - "WORD_FOUND": "{{winner}} быстрее всех нашёл слово!", - "GAME_STATS": "🎉 | {{winner}} победил!\n\n**Статистика:**\n*-* __**Участники**__: {{participants}} ({{participantCount}})\n**Статистика игры: **\n__**Длительность**__: {{duration}}\n__**Кол-во участников**__ : {{participantCount}}", - "CREDITS": "{{winner}} выиграл {{credits}}!", - "NO_WINNER_ALL": "Слова не найдены, игра окончена!", - "NO_WINNER": "Слова не найдены, игра окончена!" -} \ No newline at end of file diff --git a/languages/ru-RU/economy/transactions.json b/languages/ru-RU/economy/transactions.json index 21fe6678..bc3748af 100644 --- a/languages/ru-RU/economy/transactions.json +++ b/languages/ru-RU/economy/transactions.json @@ -5,7 +5,6 @@ "NO_TRANSACTIONS": "У вас нет транзакций.", "EMBED_TRANSACTIONS": "Ваши транзакции", "BANK": "Банк", - "WORDS": "Угадай слово", "NUMBERS": "Угадай число", "HORSERACE": "Конные скачки", "TTT": "Крестики-нолики", diff --git a/languages/ru-RU/fun/choice.json b/languages/ru-RU/fun/choice.json deleted file mode 100644 index ecdc71d5..00000000 --- a/languages/ru-RU/fun/choice.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Я могу помочь вам с выбором!", - "USAGE": "choice [вариант1/вариант2/вариант3/вариант4...]", - "EXAMPLES": "choice Вода/Огонь/Ветер", - "MISSING": "Укажите больше двух вариантов!\n(либо используйте команду `flip`)", - "EMPTY": "Кажется один из вариантов отсутствует... Попробуйте ещё раз!", - "PROGRESS": "Думаю...", - "DONE": "Я выбрал: **`{{result}}`**" -} \ No newline at end of file diff --git a/languages/ru-RU/images/avatar.json b/languages/ru-RU/general/avatar.json similarity index 100% rename from languages/ru-RU/images/avatar.json rename to languages/ru-RU/general/avatar.json diff --git a/languages/ru-RU/general/permissions.json b/languages/ru-RU/general/permissions.json deleted file mode 100644 index e84eb7c1..00000000 --- a/languages/ru-RU/general/permissions.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Показать права пользователя", - "USAGE": "permissions (@пользователь)", - "EXAMPLES": "permissions\npermissions @Jonny_Bro#4226", - "TITLE": "Права {{user}} в канале {{channel}}" -} \ No newline at end of file diff --git a/languages/ru-RU/general/quote.json b/languages/ru-RU/general/quote.json deleted file mode 100644 index 96b97d0b..00000000 --- a/languages/ru-RU/general/quote.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Процитировать сообщение в канал!", - "USAGE": "quote [ID-сообщения] (канал)", - "EXAMPLES": "quote 596018101921906698\nquote 596018101921906698 573508780520898581\nquote 596018101921906698 #основной", - "NO_MESSAGE_ID": "Нет сообщений с данным ID.", - "NO_CHANNEL_ID": "Нет канала с данным ID или названием.", - "MISSING_ID": "Укажите ID сообщения!" -} \ No newline at end of file diff --git a/languages/ru-RU/images/approved.json b/languages/ru-RU/images/approved.json deleted file mode 100644 index 438d0cc8..00000000 --- a/languages/ru-RU/images/approved.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"approved\"", - "USAGE": "approved (@пользователь)", - "EXAMPLES": "approved\napproved @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/batslap.json b/languages/ru-RU/images/batslap.json deleted file mode 100644 index 14fa22fc..00000000 --- a/languages/ru-RU/images/batslap.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"batslap\"", - "USAGE": "batslap (@пользователь1) (@пользователь2)", - "EXAMPLES": "batslap\nbatslap @Jonny_Bro#4226 @JaBa#9042" -} \ No newline at end of file diff --git a/languages/ru-RU/images/beautiful.json b/languages/ru-RU/images/beautiful.json deleted file mode 100644 index 0163009a..00000000 --- a/languages/ru-RU/images/beautiful.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"beautiful\"", - "USAGE": "beautiful (@пользователь)", - "EXAMPLES": "beautiful\nbeautiful @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/bed.json b/languages/ru-RU/images/bed.json deleted file mode 100644 index 429f76a3..00000000 --- a/languages/ru-RU/images/bed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"bed\"", - "USAGE": "bed (@пользователь1) (@пользователь2)", - "EXAMPLES": "bed @Jonny_Bro#4226\nbed @Jonny_Bro#4226 @Dkflbvbh k.hyfqc#9402" -} \ No newline at end of file diff --git a/languages/ru-RU/images/brazzers.json b/languages/ru-RU/images/brazzers.json deleted file mode 100644 index 8fb55cc8..00000000 --- a/languages/ru-RU/images/brazzers.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"brazzers\"", - "USAGE": "brazzers (@пользователь)", - "EXAMPLES": "brazzers\nbrazzers @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/burn.json b/languages/ru-RU/images/burn.json deleted file mode 100644 index 334b736c..00000000 --- a/languages/ru-RU/images/burn.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"burn\"", - "USAGE": "burn (@пользователь)", - "EXAMPLES": "burn\nburn @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/captcha.json b/languages/ru-RU/images/captcha.json deleted file mode 100644 index e783f20e..00000000 --- a/languages/ru-RU/images/captcha.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"captcha\"", - "USAGE": "captcha (@пользователь)", - "EXAMPLES": "captcha\ncaptcha @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/challenger.json b/languages/ru-RU/images/challenger.json deleted file mode 100644 index c2840534..00000000 --- a/languages/ru-RU/images/challenger.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"challenger\"", - "USAGE": "challenger (@пользователь)", - "EXAMPLES": "challenger\nchallenger @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/clyde.json b/languages/ru-RU/images/clyde.json deleted file mode 100644 index d1cf8bb8..00000000 --- a/languages/ru-RU/images/clyde.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"Clyde\"", - "USAGE": "clyde [текст]", - "EXAMPLES": "clyde Discord закроется 11 декабря 2002 года. Прощайте!.", - "MISSING_TEXT": "Введите текст!" -} \ No newline at end of file diff --git a/languages/ru-RU/images/crush.json b/languages/ru-RU/images/crush.json deleted file mode 100644 index dd4cdf64..00000000 --- a/languages/ru-RU/images/crush.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"crush\"", - "USAGE": "crush (@пользователь)", - "EXAMPLES": "crush\ncrush @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/dictator.json b/languages/ru-RU/images/dictator.json deleted file mode 100644 index 6e8d5183..00000000 --- a/languages/ru-RU/images/dictator.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"dictator\"", - "USAGE": "dictator (@пользователь)", - "EXAMPLES": "dictator\ndictator @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/facepalm.json b/languages/ru-RU/images/facepalm.json deleted file mode 100644 index cbb35931..00000000 --- a/languages/ru-RU/images/facepalm.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"facepalm\"", - "USAGE": "facepalm (@пользователь)", - "EXAMPLES": "facepalm\nfacepalm @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/fire.json b/languages/ru-RU/images/fire.json deleted file mode 100644 index 323ace8b..00000000 --- a/languages/ru-RU/images/fire.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"fire\"", - "USAGE": "fire (@пользователь)", - "EXAMPLES": "fire\nfire @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/jail.json b/languages/ru-RU/images/jail.json deleted file mode 100644 index 9df09c50..00000000 --- a/languages/ru-RU/images/jail.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"jail\"", - "USAGE": "jail (@пользователь)", - "EXAMPLES": "jail\njail @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/love.json b/languages/ru-RU/images/love.json deleted file mode 100644 index 393acee1..00000000 --- a/languages/ru-RU/images/love.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"love\"", - "USAGE": "love (@пользователь1) (@пользователь2)", - "EXAMPLES": "love @Jonny_Bro#4226\nlove @Jonny_Bro#4226 @JaBa#9042" -} \ No newline at end of file diff --git a/languages/ru-RU/images/magik.json b/languages/ru-RU/images/magik.json deleted file mode 100644 index efcaec27..00000000 --- a/languages/ru-RU/images/magik.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"magik\"", - "USAGE": "magik (@пользователь)", - "EXAMPLES": "magik\nmagik @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/mission.json b/languages/ru-RU/images/mission.json deleted file mode 100644 index 76c18616..00000000 --- a/languages/ru-RU/images/mission.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"mission\"", - "USAGE": "mission (@пользователь)", - "EXAMPLES": "mission\nmission @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/phcomment.json b/languages/ru-RU/images/phcomment.json deleted file mode 100644 index f19ab323..00000000 --- a/languages/ru-RU/images/phcomment.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"phcomment\"", - "USAGE": "phcomment (@пользователь) [текст]", - "EXAMPLES": "phcomment Привет!\nphcomment @Jonny_Bro#4226 Привет!", - "MISSING_TEXT": "Укажите текст!" -} \ No newline at end of file diff --git a/languages/ru-RU/images/ps4.json b/languages/ru-RU/images/ps4.json deleted file mode 100644 index bfd52420..00000000 --- a/languages/ru-RU/images/ps4.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"ps4\"", - "USAGE": "ps4 (@пользователь)", - "EXAMPLES": "ps4\nps4 @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/qrcode.json b/languages/ru-RU/images/qrcode.json deleted file mode 100644 index 842082af..00000000 --- a/languages/ru-RU/images/qrcode.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Создать QR код из текста", - "USAGE": "qrcode [текст]", - "EXAMPLES": "qrcode Hello World!", - "MISSING_TEXT": "Укажите текст!", - "SUCCESS": "Вот ваш QR код!" -} \ No newline at end of file diff --git a/languages/ru-RU/images/rip.json b/languages/ru-RU/images/rip.json deleted file mode 100644 index b0a3b421..00000000 --- a/languages/ru-RU/images/rip.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"rip\"", - "USAGE": "rip (@пользователь)", - "EXAMPLES": "rip\nrip @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/scary.json b/languages/ru-RU/images/scary.json deleted file mode 100644 index 8e608a16..00000000 --- a/languages/ru-RU/images/scary.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"scary\"", - "USAGE": "scary (@пользователь)", - "EXAMPLES": "scary\nscary @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/steamcard.json b/languages/ru-RU/images/steamcard.json deleted file mode 100644 index 93a564ba..00000000 --- a/languages/ru-RU/images/steamcard.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"steamcard\"", - "USAGE": "steamcard [текст] (@пользователь)", - "EXAMPLES": "steamcard Коллекционная карточка\nsteamcard Карточка @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/tobecontinued.json b/languages/ru-RU/images/tobecontinued.json deleted file mode 100644 index 2bf5d1b9..00000000 --- a/languages/ru-RU/images/tobecontinued.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"tobecontinued\"", - "USAGE": "tobecontinued (@пользователь)", - "EXAMPLES": "tobecontinued\ntobecontinued @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/trash.json b/languages/ru-RU/images/trash.json deleted file mode 100644 index 6e3bca23..00000000 --- a/languages/ru-RU/images/trash.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"trash\"", - "USAGE": "trash (@пользователь)", - "EXAMPLES": "trash\ntrash @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/triggered.json b/languages/ru-RU/images/triggered.json deleted file mode 100644 index 7030e4b3..00000000 --- a/languages/ru-RU/images/triggered.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"triggered\"", - "USAGE": "triggered (@пользователь)", - "EXAMPLES": "triggered\ntriggered @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/wanted.json b/languages/ru-RU/images/wanted.json deleted file mode 100644 index 60bcb6d0..00000000 --- a/languages/ru-RU/images/wanted.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"wanted\"", - "USAGE": "wanted (@пользователь)", - "EXAMPLES": "wanted\nwanted @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/wasted.json b/languages/ru-RU/images/wasted.json deleted file mode 100644 index f38a3710..00000000 --- a/languages/ru-RU/images/wasted.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"wasted\"", - "USAGE": "wasted (@пользователь)", - "EXAMPLES": "wasted\nwasted @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/ru-RU/images/youtube-comment.json b/languages/ru-RU/images/youtube-comment.json deleted file mode 100644 index e9f17ff7..00000000 --- a/languages/ru-RU/images/youtube-comment.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Создать изображение \"ytcomment\"", - "USAGE": "ytcomment (@пользователь) [текст]", - "EXAMPLES": "ytomment Привет!\nytcomment @Jonny_Bro#4226 Привет!" -} \ No newline at end of file diff --git a/languages/ru-RU/music/filter.json b/languages/ru-RU/music/filter.json deleted file mode 100644 index 9ce906ee..00000000 --- a/languages/ru-RU/music/filter.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Включить или отключить фильтр музыки", - "USAGE": "filter [фильтр]", - "EXAMPLES": "filter vaporwave", - "MISSING_FILTER": "Укажите фильтр для его включения! (или отправьте `filters`, чтобы увидеть статусы фильтров)", - "UNKNOWN_FILTER": "Заданный фильтр не существует! Используйте `filters` чтобы увидеть список фильтров или `filter off` чтобы отключить все фильтры!", - "CHANGING_FILTER": "Обновляю фильтры, подождите...", - "REMOVING_FILTER": "Отключаю все фильтры, подождите..." -} \ No newline at end of file diff --git a/languages/ru-RU/music/filters.json b/languages/ru-RU/music/filters.json deleted file mode 100644 index 8f5f9bc3..00000000 --- a/languages/ru-RU/music/filters.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Получить список фильтров и их статусы", - "USAGE": "filters", - "EXAMPLES": "filters", - "TITLE": "**Фильтры**", - "CONTENT": "Вот список всех имеющихся фильтров.\nИспользуйте `filter <фильтр>`, чтобы изменить статус одного из них." -} \ No newline at end of file diff --git a/languages/ru-RU/music/lyrics.json b/languages/ru-RU/music/lyrics.json deleted file mode 100644 index 98622a3f..00000000 --- a/languages/ru-RU/music/lyrics.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DESCRIPTION": "Найти текст песни", - "USAGE": "lyrics [название-песни]", - "EXAMPLES": "lyrics Skyfall", - "LYRICS_OF": "🎤 Текст {{songName}}", - "AND_MORE": "\n**и т.д...**", - "CLICK_HERE": "Нажмите сюда, чтобы открыть ссылку на слова к этой песне", - "MISSING_SONG_NAME": "Укажите название песни!", - "NO_LYRICS_FOUND": "Текст песни `{{songName}}` не найден!" -} \ No newline at end of file diff --git a/languages/ru-RU/owner/eval.json b/languages/ru-RU/owner/eval.json index 29069e6a..afb63f84 100644 --- a/languages/ru-RU/owner/eval.json +++ b/languages/ru-RU/owner/eval.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Выполнить код!", - "USAGE": "код", + "USAGE": "[код]", "EXAMPLES": "eval interaction.channel.send({ content: \"Hello World!\" })" } \ No newline at end of file diff --git a/languages/ru-RU/time.json b/languages/ru-RU/time.json deleted file mode 100644 index 9eedc864..00000000 --- a/languages/ru-RU/time.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ONE_DAY": "1 день", - "DAYS": "{{amount}} дня/дней", - "ONE_HOUR": "1 час", - "HOURS": "{{amount}} час(а/ов)", - "ONE_MINUTE": "1 минута", - "MINUTES": "{{amount}} минут(ы)", - "ONE_SECOND": "1 секунда", - "SECONDS": "{{amount}} секунд(ы)" -} \ No newline at end of file diff --git a/languages/uk-UA/administration/addcommand.json b/languages/uk-UA/administration/addcommand.json deleted file mode 100644 index ac95f060..00000000 --- a/languages/uk-UA/administration/addcommand.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Створити власну команду!", - "USAGE": "addcommand [назва] [відповідь]", - "EXAMPLES": "addcommand hello Привіт, {user}. Добро пожаловать на {guild}!", - "MISSING_NAME": "Укажіть назву команди!", - "MISSING_ANSWER": "Укажіть відповідь команди!", - "SUCCESS": "Команда **{{commandName}}** створена!" -} \ No newline at end of file diff --git a/languages/uk-UA/administration/delcommand.json b/languages/uk-UA/administration/delcommand.json deleted file mode 100644 index a424af90..00000000 --- a/languages/uk-UA/administration/delcommand.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Видалити власну команду!", - "USAGE": "delcommand [назва]", - "EXAMPLES": "delcommand hello", - "MISSING_NAME": "Введіть назву команди!", - "UNKNOWN_COMMAND": "Команда {{commandName}} не існує!", - "SUCCESS": "Команда {{commandName}} була видалена з серверу!" -} \ No newline at end of file diff --git a/languages/uk-UA/administration/ignore.json b/languages/uk-UA/administration/ignore.json deleted file mode 100644 index c9a71908..00000000 --- a/languages/uk-UA/administration/ignore.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Увімкнути або вимкнути використання команд у каналі", - "USAGE": "ignore [канал]", - "EXAMPLES": "ignore #основний", - "ALLOWED": "Тепер команди в {{channel}} дозволені!", - "IGNORED": "Тепер команди в {{channel}} заборонені!" - } \ No newline at end of file diff --git a/languages/uk-UA/economy/findwords.json b/languages/uk-UA/economy/findwords.json deleted file mode 100644 index cd1626fe..00000000 --- a/languages/uk-UA/economy/findwords.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "DESCRIPTION": "Вгадай задумане мною слово!", - "USAGE": "findwords (STOP)", - "EXAMPLES": "findwords", - "INVALID_WORD": "{{member}} | Це слово не існує або я його не знаю :(", - "GAME_STARTING": ":timer: | Гра розпочнеться через 10 секунд!\nНапишіть STOP, якщо хочете зупинити гру!", - "FIND_WORD": "20 секунд, щоб знайти слово, в якому є **{{word}}**!", - "WORD_FOUND": "{{winner}} найшвидше знайшов слово!", - "GAME_STATS": "🎉 | {{winner}} переміг!\n\n**Статистика:**\n*-* __**Учасники**__: {{participants}} ({{participantCount}})\n**Статистика гри: **\n__**Тривалість**__: {{duration}}\n__**Кількість учасників**__ : {{participantCount}}", - "CREDITS": "{{winner}} виграв {{credits}}!", - "NO_WINNER_ALL": "Слова не знайдені, гра закінчена!", - "NO_WINNER": "Слова не знайдені, гра закінчена!" - } \ No newline at end of file diff --git a/languages/uk-UA/economy/transactions.json b/languages/uk-UA/economy/transactions.json index 4b9a50b5..59cf084f 100644 --- a/languages/uk-UA/economy/transactions.json +++ b/languages/uk-UA/economy/transactions.json @@ -5,7 +5,6 @@ "NO_TRANSACTIONS": "У вас немає транзакцій.", "EMBED_TRANSACTIONS": "Ваші транзакції", "BANK": "Банк", - "WORDS": "Вгадай слово", "NUMBERS": "Вгадай число", "HORSERACE": "Кінні перегони", "TTT": "Хрестики-нуліки", diff --git a/languages/uk-UA/fun/choice.json b/languages/uk-UA/fun/choice.json deleted file mode 100644 index f0ce0b68..00000000 --- a/languages/uk-UA/fun/choice.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Я можу допомогти вам із вибором!", - "USAGE": "choice [варіант1/варіант2/варіант3/варіант4...]", - "EXAMPLES": "choice Вода/Вогонь/Вітер", - "MISSING": "Вкажіть більше двох варіантів!\n(або використовуйте команду `flip`)", - "EMPTY": "Здається, один з варіантів відсутній... Спробуйте ще раз!", - "PROGRESS": "Думаю...", - "DONE": "Я вибрав: **`{{result}}`**" -} \ No newline at end of file diff --git a/languages/uk-UA/images/avatar.json b/languages/uk-UA/general/avatar.json similarity index 100% rename from languages/uk-UA/images/avatar.json rename to languages/uk-UA/general/avatar.json diff --git a/languages/uk-UA/general/permissions.json b/languages/uk-UA/general/permissions.json deleted file mode 100644 index 1e416393..00000000 --- a/languages/uk-UA/general/permissions.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Показати права користувача", - "USAGE": "permissions (@користувач)", - "EXAMPLES": "permissions\npermissions @Jonny_Bro#4226", - "TITLE": "{{user}} у каналі {{channel}}" -} \ No newline at end of file diff --git a/languages/uk-UA/general/quote.json b/languages/uk-UA/general/quote.json deleted file mode 100644 index 370e7dea..00000000 --- a/languages/uk-UA/general/quote.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "DESCRIPTION": "Процитувати повідомлення в канал!", - "USAGE": "quote [ID-повідомлення] (канал)", - "EXAMPLES": "quote 596018101921906698\nquote 596018101921906698 573508780520898581\nquote 5960", - "NO_MESSAGE_ID": "Немає повідомлень з цим ID.", - "NO_CHANNEL_ID": "Немає каналу з ID або назвою.", - "MISSING_ID": "Вкажіть ID повідомлення!" - } \ No newline at end of file diff --git a/languages/uk-UA/images/approved.json b/languages/uk-UA/images/approved.json deleted file mode 100644 index caa15db5..00000000 --- a/languages/uk-UA/images/approved.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"approved\"", - "USAGE": "approved (@користувач)", - "EXAMPLES": "approved\napproved @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/batslap.json b/languages/uk-UA/images/batslap.json deleted file mode 100644 index a6017abb..00000000 --- a/languages/uk-UA/images/batslap.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"batslap\"", - "USAGE": "batslap (@користувач1) (@користувач2)", - "EXAMPLES": "batslap\nbatslap @Jonny_Bro#4226 @JaBa#9042" -} \ No newline at end of file diff --git a/languages/uk-UA/images/beautiful.json b/languages/uk-UA/images/beautiful.json deleted file mode 100644 index ea26b7ca..00000000 --- a/languages/uk-UA/images/beautiful.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"beautiful\"", - "USAGE": "beautiful (@користувач)", - "EXAMPLES": "beautiful\nbeautiful @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/bed.json b/languages/uk-UA/images/bed.json deleted file mode 100644 index 791d303f..00000000 --- a/languages/uk-UA/images/bed.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"bed\"", - "USAGE": "bed (@користувач1) (@користувач2)", - "EXAMPLES": "bed @Jonny_Bro#4226\nbed @Jonny_Bro#4226 @Dkflbvbh k.hyfqc#9402" - } \ No newline at end of file diff --git a/languages/uk-UA/images/brazzers.json b/languages/uk-UA/images/brazzers.json deleted file mode 100644 index d43a3b2f..00000000 --- a/languages/uk-UA/images/brazzers.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"brazzers\"", - "USAGE": "brazzers (@користувач)", - "EXAMPLES": "brazzers\nbrazzers @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/burn.json b/languages/uk-UA/images/burn.json deleted file mode 100644 index 1dbc6604..00000000 --- a/languages/uk-UA/images/burn.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"burn\"", - "USAGE": "burn (@користувач)", - "EXAMPLES": "burn\nburn @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/captcha.json b/languages/uk-UA/images/captcha.json deleted file mode 100644 index 62acade4..00000000 --- a/languages/uk-UA/images/captcha.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"captcha\"", - "USAGE": "captcha (@користувач)", - "EXAMPLES": "captcha\ncaptcha @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/challenger.json b/languages/uk-UA/images/challenger.json deleted file mode 100644 index a0b627bd..00000000 --- a/languages/uk-UA/images/challenger.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"challenger\"", - "USAGE": "challenger (@користувач)", - "EXAMPLES": "challenger\nchallenger @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/clyde.json b/languages/uk-UA/images/clyde.json deleted file mode 100644 index e7573d47..00000000 --- a/languages/uk-UA/images/clyde.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"Clyde\"", - "USAGE": "clyde [текст]", - "EXAMPLES": "clyde Discord закриється 11 грудня 2002 року. Прощайте!.", - "MISSING_TEXT": "Введіть текст!" -} \ No newline at end of file diff --git a/languages/uk-UA/images/crush.json b/languages/uk-UA/images/crush.json deleted file mode 100644 index 73ed728d..00000000 --- a/languages/uk-UA/images/crush.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"crush\"", - "USAGE": "crush (@користувач)", - "EXAMPLES": "crush\ncrush @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/dictator.json b/languages/uk-UA/images/dictator.json deleted file mode 100644 index cc8db5ac..00000000 --- a/languages/uk-UA/images/dictator.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"dictator\"", - "USAGE": "dictator (@користувач)", - "EXAMPLES": "dictator\ndictator @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/facepalm.json b/languages/uk-UA/images/facepalm.json deleted file mode 100644 index 30ead48e..00000000 --- a/languages/uk-UA/images/facepalm.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"facepalm\"", - "USAGE": "facepalm (@користувач)", - "EXAMPLES": "facepalm\nfacepalm @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/fire.json b/languages/uk-UA/images/fire.json deleted file mode 100644 index 0fb84bc3..00000000 --- a/languages/uk-UA/images/fire.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"fire\"", - "USAGE": "fire (@користувач)", - "EXAMPLES": "fire\nfire @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/jail.json b/languages/uk-UA/images/jail.json deleted file mode 100644 index 832b7322..00000000 --- a/languages/uk-UA/images/jail.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"jail\"", - "USAGE": "jail (@користувач)", - "EXAMPLES": "jail\njail @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/love.json b/languages/uk-UA/images/love.json deleted file mode 100644 index 2274e9dd..00000000 --- a/languages/uk-UA/images/love.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"love\"", - "USAGE": "love (@користувач1) (@користувач2)", - "EXAMPLES": "love @Jonny_Bro#4226\nlove @Jonny_Bro#4226 @JaBa#9042" -} \ No newline at end of file diff --git a/languages/uk-UA/images/magik.json b/languages/uk-UA/images/magik.json deleted file mode 100644 index ff512e9d..00000000 --- a/languages/uk-UA/images/magik.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"magik\"", - "USAGE": "magik (@користувач)", - "EXAMPLES": "magik\nmagik @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/mission.json b/languages/uk-UA/images/mission.json deleted file mode 100644 index 2cbb6ca6..00000000 --- a/languages/uk-UA/images/mission.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"mission\"", - "USAGE": "mission (@користувач)", - "EXAMPLES": "mission\nmission @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/phcomment.json b/languages/uk-UA/images/phcomment.json deleted file mode 100644 index 997b3736..00000000 --- a/languages/uk-UA/images/phcomment.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"phcomment\"", - "USAGE": "phcomment (@користувач) [текст]", - "EXAMPLES": "phcomment Привіт!\nphcomment @Jonny_Bro#4226 Привіт!", - "MISSING_TEXT": "Вкажіть текст!" -} \ No newline at end of file diff --git a/languages/uk-UA/images/ps4.json b/languages/uk-UA/images/ps4.json deleted file mode 100644 index d881362d..00000000 --- a/languages/uk-UA/images/ps4.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"ps4\"", - "USAGE": "ps4 (@користувач)", - "EXAMPLES": "ps4\nps4 @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/qrcode.json b/languages/uk-UA/images/qrcode.json deleted file mode 100644 index 70fe7fa3..00000000 --- a/languages/uk-UA/images/qrcode.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Створити QR код із тексту", - "USAGE": "qrcode [текст]", - "EXAMPLES": "qrcode Hello World!", - "MISSING_TEXT": "Вкажіть текст!", - "SUCCESS": "От ваш QR код!" -} \ No newline at end of file diff --git a/languages/uk-UA/images/rip.json b/languages/uk-UA/images/rip.json deleted file mode 100644 index e610aac8..00000000 --- a/languages/uk-UA/images/rip.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"rip\"", - "USAGE": "rip (@користувач)", - "EXAMPLES": "rip\nrip @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/scary.json b/languages/uk-UA/images/scary.json deleted file mode 100644 index 956fc28f..00000000 --- a/languages/uk-UA/images/scary.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"scary\"", - "USAGE": "scary (@користувач)", - "EXAMPLES": "scary\nscary @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/steamcard.json b/languages/uk-UA/images/steamcard.json deleted file mode 100644 index 53dfe105..00000000 --- a/languages/uk-UA/images/steamcard.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"steamcard\"", - "USAGE": "steamcard [текст] (@користувач)", - "EXAMPLES": "steamcard Колекційна картка\nsteamcard Картка @Jonny_Bro#4226" - } \ No newline at end of file diff --git a/languages/uk-UA/images/tobecontinued.json b/languages/uk-UA/images/tobecontinued.json deleted file mode 100644 index bac9c48a..00000000 --- a/languages/uk-UA/images/tobecontinued.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"tobecontinued\"", - "USAGE": "tobecontinued (@користувач)", - "EXAMPLES": "tobecontinued\ntobecontinued @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/trash.json b/languages/uk-UA/images/trash.json deleted file mode 100644 index 57af51ee..00000000 --- a/languages/uk-UA/images/trash.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"trash\"", - "USAGE": "trash (@користувач)", - "EXAMPLES": "trash\ntrash @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/triggered.json b/languages/uk-UA/images/triggered.json deleted file mode 100644 index ec37c9df..00000000 --- a/languages/uk-UA/images/triggered.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"triggered\"", - "USAGE": "triggered (@користувач)", - "EXAMPLES": "triggered\ntriggered @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/wanted.json b/languages/uk-UA/images/wanted.json deleted file mode 100644 index 10bf93b3..00000000 --- a/languages/uk-UA/images/wanted.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"wanted\"", - "USAGE": "wanted (@користувач)", - "EXAMPLES": "wanted\nwanted @Jonny_Bro#4226" - } \ No newline at end of file diff --git a/languages/uk-UA/images/wasted.json b/languages/uk-UA/images/wasted.json deleted file mode 100644 index 89e8afe3..00000000 --- a/languages/uk-UA/images/wasted.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"wasted\"", - "USAGE": "wasted (@користувач)", - "EXAMPLES": "wasted\nwasted @Jonny_Bro#4226" -} \ No newline at end of file diff --git a/languages/uk-UA/images/youtube-comment.json b/languages/uk-UA/images/youtube-comment.json deleted file mode 100644 index eb7e93da..00000000 --- a/languages/uk-UA/images/youtube-comment.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "DESCRIPTION": "Створити зображення \"ytcomment\"", - "USAGE": "ytcomment (@користувач) [текст]", - "EXAMPLES": "ytcomment Привіт!\nytcomment @Jonny_Bro#4226 Привіт!" -} \ No newline at end of file diff --git a/languages/uk-UA/music/filter.json b/languages/uk-UA/music/filter.json deleted file mode 100644 index 36638a28..00000000 --- a/languages/uk-UA/music/filter.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Увімкнути або вимкнути фільтр музики", - "USAGE": "filter [фільтр]", - "EXAMPLES": "filter vaporwave", - "MISSING_FILTER": "Вкажіть фільтр для його включення! (або надішліть `filters`, щоб побачити статуси фільтрів)", - "UNKNOWN_FILTER": "Заданий фільтр не існує! Використовуйте `filters` щоб побачити список фільтрів або `filter off` щоб вимкнути всі фільтри!", - "CHANGING_FILTER": "Обновляю фільтри, зачекайте...", - "REMOVING_FILTER": "Відключаю всі фільтри, зачекайте..." -} \ No newline at end of file diff --git a/languages/uk-UA/music/filters.json b/languages/uk-UA/music/filters.json deleted file mode 100644 index dd0310db..00000000 --- a/languages/uk-UA/music/filters.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Отримати список фільтрів та їх статуси", - "USAGE": "filters", - "EXAMPLES": "filters", - "TITLE": "**Фільтри**", - "CONTENT": "Ось список усіх наявних фільтрів.\nВикористовуйте `filter <фільтр>`, щоб змінити статус одного з них." -} \ No newline at end of file diff --git a/languages/uk-UA/music/lyrics.json b/languages/uk-UA/music/lyrics.json deleted file mode 100644 index 0f8e8031..00000000 --- a/languages/uk-UA/music/lyrics.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DESCRIPTION": "Знайти текст пісні", - "USAGE": "lyrics [назва-пісні]", - "EXAMPLES": "lyrics Skyfall", - "LYRICS_OF": "🎤 Текст {{songName}}", - "AND_MORE": "\n**і т.д...**", - "CLICK_HERE": "Натисніть сюди, щоб відкрити посилання на слова до цієї пісні", - "MISSING_SONG_NAME": "Вкажіть назву пісні!", - "NO_LYRICS_FOUND": "Текст пісні `{{songName}}` не знайдено!" -} \ No newline at end of file diff --git a/languages/uk-UA/time.json b/languages/uk-UA/time.json deleted file mode 100644 index 0c17d899..00000000 --- a/languages/uk-UA/time.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "ONE_DAY": "1 день", - "DAYS": "{{amount}} дня/днів", - "ONE_HOUR": "1 година", - "HOURS": "{{amount}} годин(и)", - "ONE_MINUTE": "1 хвилина", - "MINUTES": "{{amount}} хвилин(и)", - "ONE_SECOND": "1 секунда", - "SECONDS": "{{amount}} секунд(и)" -} \ No newline at end of file From 4b857b830b589f61eaef55651adc554f1f68b574 Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Fri, 29 Jul 2022 23:31:08 +0500 Subject: [PATCH 06/16] =?UTF-8?q?=D0=91=D0=BE=D0=BB=D1=8C=D1=88=D0=B5=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=20=D0=B8=20=D1=84=D0=B8?= =?UTF-8?q?=D0=BA=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/Administration/addemoji.js | 38 +++ TO REWRITE/Administration/automod.js | 55 ++++ TO REWRITE/Administration/autorole.js | 60 ++++ TO REWRITE/Administration/backup.js | 145 ++++++++++ TO REWRITE/Administration/configuration.js | 98 +++++++ TO REWRITE/Administration/deletemod.js | 35 +++ TO REWRITE/Administration/goodbye.js | 108 +++++++ TO REWRITE/Administration/set.js | 57 ++++ TO REWRITE/Administration/setbirthdays.js | 45 +++ TO REWRITE/Administration/setlang.js | 33 +++ TO REWRITE/Administration/setmodlogs.js | 45 +++ TO REWRITE/Administration/setprefix.js | 33 +++ TO REWRITE/Administration/setreports.js | 45 +++ TO REWRITE/Administration/setsuggests.js | 45 +++ TO REWRITE/Administration/stealemoji.js | 39 +++ TO REWRITE/Administration/welcome.js | 111 ++++++++ TO REWRITE/Economy/achievements.js | 80 ++++++ TO REWRITE/Economy/birthdate.js | 50 ++++ TO REWRITE/Economy/deposit.js | 52 ++++ TO REWRITE/Economy/divorce.js | 45 +++ TO REWRITE/Economy/horserace.js | 184 ++++++++++++ TO REWRITE/Economy/leaderboard.js | 174 ++++++++++++ TO REWRITE/Economy/marry.js | 134 +++++++++ TO REWRITE/Economy/money.js | 75 +++++ TO REWRITE/Economy/number.js | 97 +++++++ TO REWRITE/Economy/pay.js | 59 ++++ TO REWRITE/Economy/profile.js | 98 +++++++ TO REWRITE/Economy/rep.js | 71 +++++ TO REWRITE/Economy/rob.js | 78 ++++++ TO REWRITE/Economy/setbio.js | 30 ++ TO REWRITE/Economy/slots.js | 208 ++++++++++++++ TO REWRITE/Economy/tictactoe.js | 46 +++ TO REWRITE/Economy/transactions.js | 56 ++++ TO REWRITE/Economy/withdraw.js | 52 ++++ TO REWRITE/Economy/work.js | 114 ++++++++ {commands => TO REWRITE}/Examples/mention.js | 0 {commands => TO REWRITE}/Examples/ping.js | 0 {commands => TO REWRITE}/Examples/repeat.js | 0 TO REWRITE/Fun/8ball.js | 31 +++ TO REWRITE/Fun/ascii.js | 34 +++ TO REWRITE/Fun/flip.js | 25 ++ TO REWRITE/Fun/lmg.js | 30 ++ TO REWRITE/Fun/lovecalc.js | 59 ++++ TO REWRITE/Fun/memes.js | 78 ++++++ TO REWRITE/General/activity.js | 263 ++++++++++++++++++ TO REWRITE/General/avatar.js | 37 +++ TO REWRITE/General/emoji.js | 46 +++ TO REWRITE/General/help.js | 117 ++++++++ TO REWRITE/General/invite.js | 55 ++++ TO REWRITE/General/invites.js | 72 +++++ TO REWRITE/General/minecraft.js | 85 ++++++ TO REWRITE/General/permissions.js | 50 ++++ TO REWRITE/General/quote.js | 88 ++++++ TO REWRITE/General/remindme.js | 45 +++ TO REWRITE/General/report.js | 69 +++++ TO REWRITE/General/serverinfo.js | 71 +++++ TO REWRITE/General/setafk.js | 49 ++++ TO REWRITE/General/shorturl.js | 42 +++ TO REWRITE/General/staff.js | 42 +++ TO REWRITE/General/stats.js | 63 +++++ TO REWRITE/General/suggest.js | 64 +++++ TO REWRITE/General/translate.js | 72 +++++ TO REWRITE/General/userinfo.js | 94 +++++++ TO REWRITE/General/whois.js | 73 +++++ TO REWRITE/Moderation/announcement.js | 99 +++++++ TO REWRITE/Moderation/ban.js | 112 ++++++++ TO REWRITE/Moderation/clear.js | 80 ++++++ TO REWRITE/Moderation/clearwarns.js | 35 +++ TO REWRITE/Moderation/giveaway.js | 127 +++++++++ TO REWRITE/Moderation/kick.js | 100 +++++++ TO REWRITE/Moderation/mute.js | 113 ++++++++ TO REWRITE/Moderation/poll.js | 109 ++++++++ TO REWRITE/Moderation/sanctions.js | 61 ++++ TO REWRITE/Moderation/setwarns.js | 68 +++++ TO REWRITE/Moderation/unban.js | 60 ++++ TO REWRITE/Moderation/unmute.js | 47 ++++ TO REWRITE/Moderation/warn.js | 144 ++++++++++ TO REWRITE/Music/autoplay.js | 32 +++ TO REWRITE/Music/back.js | 50 ++++ TO REWRITE/Music/clip.js | 58 ++++ TO REWRITE/Music/clips.js | 46 +++ TO REWRITE/Music/jump.js | 53 ++++ TO REWRITE/Music/loop.js | 40 +++ TO REWRITE/Music/np.js | 63 +++++ TO REWRITE/Music/pause.js | 32 +++ TO REWRITE/Music/play.js | 45 +++ TO REWRITE/Music/queue.js | 66 +++++ TO REWRITE/Music/resume.js | 32 +++ TO REWRITE/Music/seek.js | 35 +++ TO REWRITE/Music/skip.js | 52 ++++ TO REWRITE/Music/stop.js | 48 ++++ base/JaBa.js | 144 ++-------- commands/General/ping.js | 40 +++ commands/NSFW/nsfw.js | 86 ++++++ commands/Owner/debug.js | 190 +++++++++++++ commands/Owner/eval.js | 2 +- commands/Owner/reload.js | 6 +- commands/Owner/say.js | 75 +++++ commands/Owner/servers.js | 134 +++++++++ events/ready.js | 1 + helpers/autoUpdateDocs.js | 12 +- helpers/birthdays.js | 6 +- helpers/checkReminds.js | 4 +- helpers/checkUnmutes.js | 4 +- helpers/extenders.js | 6 +- helpers/functions.js | 5 +- helpers/resolvers.js | 78 +++--- helpers/tictactoe.js | 150 +++++----- languages/en-US/images/brazzers.json | 2 +- languages/ru-RU/common.json | 3 +- languages/ru-RU/economy/leaderboard.json | 5 +- languages/ru-RU/nsfw/nsfw.json | 13 +- languages/ru-RU/owner/debug.json | 15 +- languages/ru-RU/owner/eval.json | 2 +- languages/ru-RU/owner/say.json | 9 +- .../owner/{servers-list.json => servers.json} | 6 +- 116 files changed, 6980 insertions(+), 274 deletions(-) create mode 100644 TO REWRITE/Administration/addemoji.js create mode 100644 TO REWRITE/Administration/automod.js create mode 100644 TO REWRITE/Administration/autorole.js create mode 100644 TO REWRITE/Administration/backup.js create mode 100644 TO REWRITE/Administration/configuration.js create mode 100644 TO REWRITE/Administration/deletemod.js create mode 100644 TO REWRITE/Administration/goodbye.js create mode 100644 TO REWRITE/Administration/set.js create mode 100644 TO REWRITE/Administration/setbirthdays.js create mode 100644 TO REWRITE/Administration/setlang.js create mode 100644 TO REWRITE/Administration/setmodlogs.js create mode 100644 TO REWRITE/Administration/setprefix.js create mode 100644 TO REWRITE/Administration/setreports.js create mode 100644 TO REWRITE/Administration/setsuggests.js create mode 100644 TO REWRITE/Administration/stealemoji.js create mode 100644 TO REWRITE/Administration/welcome.js create mode 100644 TO REWRITE/Economy/achievements.js create mode 100644 TO REWRITE/Economy/birthdate.js create mode 100644 TO REWRITE/Economy/deposit.js create mode 100644 TO REWRITE/Economy/divorce.js create mode 100644 TO REWRITE/Economy/horserace.js create mode 100644 TO REWRITE/Economy/leaderboard.js create mode 100644 TO REWRITE/Economy/marry.js create mode 100644 TO REWRITE/Economy/money.js create mode 100644 TO REWRITE/Economy/number.js create mode 100644 TO REWRITE/Economy/pay.js create mode 100644 TO REWRITE/Economy/profile.js create mode 100644 TO REWRITE/Economy/rep.js create mode 100644 TO REWRITE/Economy/rob.js create mode 100644 TO REWRITE/Economy/setbio.js create mode 100644 TO REWRITE/Economy/slots.js create mode 100644 TO REWRITE/Economy/tictactoe.js create mode 100644 TO REWRITE/Economy/transactions.js create mode 100644 TO REWRITE/Economy/withdraw.js create mode 100644 TO REWRITE/Economy/work.js rename {commands => TO REWRITE}/Examples/mention.js (100%) rename {commands => TO REWRITE}/Examples/ping.js (100%) rename {commands => TO REWRITE}/Examples/repeat.js (100%) create mode 100644 TO REWRITE/Fun/8ball.js create mode 100644 TO REWRITE/Fun/ascii.js create mode 100644 TO REWRITE/Fun/flip.js create mode 100644 TO REWRITE/Fun/lmg.js create mode 100644 TO REWRITE/Fun/lovecalc.js create mode 100644 TO REWRITE/Fun/memes.js create mode 100644 TO REWRITE/General/activity.js create mode 100644 TO REWRITE/General/avatar.js create mode 100644 TO REWRITE/General/emoji.js create mode 100644 TO REWRITE/General/help.js create mode 100644 TO REWRITE/General/invite.js create mode 100644 TO REWRITE/General/invites.js create mode 100644 TO REWRITE/General/minecraft.js create mode 100644 TO REWRITE/General/permissions.js create mode 100644 TO REWRITE/General/quote.js create mode 100644 TO REWRITE/General/remindme.js create mode 100644 TO REWRITE/General/report.js create mode 100644 TO REWRITE/General/serverinfo.js create mode 100644 TO REWRITE/General/setafk.js create mode 100644 TO REWRITE/General/shorturl.js create mode 100644 TO REWRITE/General/staff.js create mode 100644 TO REWRITE/General/stats.js create mode 100644 TO REWRITE/General/suggest.js create mode 100644 TO REWRITE/General/translate.js create mode 100644 TO REWRITE/General/userinfo.js create mode 100644 TO REWRITE/General/whois.js create mode 100644 TO REWRITE/Moderation/announcement.js create mode 100644 TO REWRITE/Moderation/ban.js create mode 100644 TO REWRITE/Moderation/clear.js create mode 100644 TO REWRITE/Moderation/clearwarns.js create mode 100644 TO REWRITE/Moderation/giveaway.js create mode 100644 TO REWRITE/Moderation/kick.js create mode 100644 TO REWRITE/Moderation/mute.js create mode 100644 TO REWRITE/Moderation/poll.js create mode 100644 TO REWRITE/Moderation/sanctions.js create mode 100644 TO REWRITE/Moderation/setwarns.js create mode 100644 TO REWRITE/Moderation/unban.js create mode 100644 TO REWRITE/Moderation/unmute.js create mode 100644 TO REWRITE/Moderation/warn.js create mode 100644 TO REWRITE/Music/autoplay.js create mode 100644 TO REWRITE/Music/back.js create mode 100644 TO REWRITE/Music/clip.js create mode 100644 TO REWRITE/Music/clips.js create mode 100644 TO REWRITE/Music/jump.js create mode 100644 TO REWRITE/Music/loop.js create mode 100644 TO REWRITE/Music/np.js create mode 100644 TO REWRITE/Music/pause.js create mode 100644 TO REWRITE/Music/play.js create mode 100644 TO REWRITE/Music/queue.js create mode 100644 TO REWRITE/Music/resume.js create mode 100644 TO REWRITE/Music/seek.js create mode 100644 TO REWRITE/Music/skip.js create mode 100644 TO REWRITE/Music/stop.js create mode 100644 commands/General/ping.js create mode 100644 commands/NSFW/nsfw.js create mode 100644 commands/Owner/debug.js create mode 100644 commands/Owner/say.js create mode 100644 commands/Owner/servers.js rename languages/ru-RU/owner/{servers-list.json => servers.json} (50%) diff --git a/TO REWRITE/Administration/addemoji.js b/TO REWRITE/Administration/addemoji.js new file mode 100644 index 00000000..e16706a7 --- /dev/null +++ b/TO REWRITE/Administration/addemoji.js @@ -0,0 +1,38 @@ +const Command = require("../../base/Command"); + +class Addemoji extends Command { + constructor(client) { + super(client, { + name: "addemoji", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["adde"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + const url = args[0]; + if (!url) return message.error("administration/addemoji:MISSING_URL"); + + const name = args[1] ? args[1].replace(/[^a-z0-9]/gi, "") : null; + if (!name) return message.error("administration/addemoji:MISSING_NAME"); + if (name.length < 2 || name.length > 32) return message.error("administration/addemoji:INVALID_NAME"); + + message.guild.emojis + .create(url, name) + .then(emoji => message.success("administration/addemoji:SUCCESS", { + emoji: emoji.name + })) + .catch(() => message.error("administration/addemoji:ERROR", { + emoji: name + })); + } +} + +module.exports = Addemoji; \ No newline at end of file diff --git a/TO REWRITE/Administration/automod.js b/TO REWRITE/Administration/automod.js new file mode 100644 index 00000000..c19365bd --- /dev/null +++ b/TO REWRITE/Administration/automod.js @@ -0,0 +1,55 @@ +const Command = require("../../base/Command"); + +class Automod extends Command { + constructor(client) { + super(client, { + name: "automod", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["autom"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const status = args[0]; + if (!status || (status !== "on" && status !== "off")) return message.error("administration/automod:MISSING_STATUS"); + + if (status === "on") { + data.guild.plugins.automod = { + enabled: true, + ignored: [] + }; + data.guild.markModified("plugins.automod"); + data.guild.save(); + message.success("administration/automod:ENABLED", { + prefix: data.guild.prefix + }); + } else if (status === "off") { + if (message.mentions.channels.filter((ch) => ch.type === "GUILD_TEXT" && ch.guild.id === message.guild.id).first()) { + const channel = message.mentions.channels.first(); + data.guild.plugins.automod.ignored.push(channel); + data.guild.markModified("plugins.automod"); + data.guild.save(); + message.success("administration/automod:DISABLED_CHANNEL", { + channel: channel.toString() + }); + } else { + data.guild.plugins.automod = { + enabled: false, + ignored: [] + }; + data.guild.markModified("plugins.automod"); + data.guild.save(); + message.success("administration/automod:DISABLED"); + } + } + } +} + +module.exports = Automod; \ No newline at end of file diff --git a/TO REWRITE/Administration/autorole.js b/TO REWRITE/Administration/autorole.js new file mode 100644 index 00000000..234d4d42 --- /dev/null +++ b/TO REWRITE/Administration/autorole.js @@ -0,0 +1,60 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Autorole extends Command { + constructor(client) { + super(client, { + name: "autorole", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["autor"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const status = args[0]; + if (status !== "on" && status !== "off") return message.error("administration/autorole:MISSING_STATUS"); + + if (status === "on") { + const role = await Resolvers.resolveRole({ + message, + search: args.slice(1).join(" ") + }); + if (!role) return message.error("administration/autorole:MISSING_ROLE"); + + data.guild.plugins.autorole = { + enabled: true, + role: role.id + }; + data.guild.markModified("plugins.autorole"); + await data.guild.save(); + + message.success("administration/autorole:SUCCESS_ENABLED", { + roleName: role.name + }); + } else if (status === "off") { + if (!data.guild.plugins.autorole.enabled) return message.success("administration/autorole:ALREADY_DISABLED", { + prefix: data.guild.prefix + }); + + data.guild.plugins.autorole = { + enabled: false, + role: null + }; + data.guild.markModified("plugins.autorole"); + await data.guild.save(); + + message.success("administration/autorole:SUCCESS_DISABLED", { + prefix: data.guild.prefix + }); + } + } +} + +module.exports = Autorole; \ No newline at end of file diff --git a/TO REWRITE/Administration/backup.js b/TO REWRITE/Administration/backup.js new file mode 100644 index 00000000..27e034e2 --- /dev/null +++ b/TO REWRITE/Administration/backup.js @@ -0,0 +1,145 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + backup = require("discord-backup"); + +backup.setStorageFolder(__dirname + "/../../backups"); + +class Backup extends Command { + constructor(client) { + super(client, { + name: "backup", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["ba"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ADMINISTRATOR"], + nsfw: false, + ownerOnly: false, + cooldown: 20000 + }); + } + + async run(message, args, data) { + const status = args[0]; + if (!status) return message.error("administration/backup:MISSING_STATUS"); + + if (status === "create") { + const m = await message.sendT("misc:PLEASE_WAIT", null, { + prefixEmoji: "loading" + }); + backup.create(message.guild).then((backup) => { + m.delete(); + + message.success("administration/backup:SUCCESS_PUBLIC"); + message.author.send(message.translate("administration/backup:SUCCESS_PRIVATE", { + backupID: backup.id + })).catch(() => { + backup.remove(backup.id); + message.error("misc:CANNOT_DM"); + }); + }).catch((err) => { + console.error(err); + return message.error("misc:ERR_OCCURRED"); + }); + } else if (status === "load") { + const backupID = args[1]; + if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); + + backup.fetch(backupID).then(async () => { + message.sendT("administration/backup:CONFIRMATION"); + + const filter = m => m.author.id === message.author.id; + const collector = message.channel.createMessageCollector({ + filter, + time: 20000 + }); + + collector.on("collect", async msg => { + if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { + message.author.send(message.translate("administration/backup:START_LOADING")); + + backup.load(backupID, message.guild).then(() => { + backup.remove(backupID); + message.author.send(message.translate("administration/backup:LOAD_SUCCESS")); + collector.stop(); + }).catch((err) => { + console.error(err); + return message.error("misc:ERR_OCCURRED"); + }); + } + }); + + collector.on("end", (_, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + }).catch((err) => { + console.error(err); + return message.error("administration/backup:NO_BACKUP_FOUND", { + backupID + }); + }); + } else if (status === "info") { + const backupID = args[1]; + if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); + + backup.fetch(backupID).then(async (backupInfo) => { + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("administration/backup:TITLE_INFO") + }) + .addField(message.translate("administration/backup:TITLE_ID"), backupInfo.id, true) + .addField(message.translate("administration/backup:TITLE_SERVER_ID"), backupInfo.data.guildID.toString(), true) + .addField(message.translate("administration/backup:TITLE_SIZE"), `${backupInfo.size} kb`, true) + .addField(message.translate("administration/backup:TITLE_CREATED_AT"), this.client.printDate(new Date(backupInfo.data.createdTimestamp)), true) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + message.reply({ + embeds: [embed] + }); + }).catch((err) => { + console.error(err); + return message.error("administration/backup:NO_BACKUP_FOUND", { + backupID + }); + }); + } else if (status === "remove") { + const backupID = args[1]; + if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); + + backup.fetch(backupID).then(async () => { + message.sendT("administration/backup:REMOVE_CONFIRMATION"); + + const filter = m => m.author.id === message.author.id; + const collector = message.channel.createMessageCollector({ + filter, + time: 20000 + }); + + collector.on("collect", async msg => { + if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { + backup.remove(backupID).then(async () => { + message.success("administration/backup:SUCCESS_REMOVED"); + }); + collector.stop(); + } + }); + + collector.on("end", (_, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + }).catch((err) => { + console.error(err); + return message.error("administration/backup:NO_BACKUP_FOUND", { + backupID + }); + }); + } else { + return message.error("administration/backup:MISSING_STATUS"); + } + } +} + +module.exports = Backup; \ No newline at end of file diff --git a/TO REWRITE/Administration/configuration.js b/TO REWRITE/Administration/configuration.js new file mode 100644 index 00000000..e6d75ef2 --- /dev/null +++ b/TO REWRITE/Administration/configuration.js @@ -0,0 +1,98 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Configuration extends Command { + constructor(client) { + super(client, { + name: "configuration", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["conf", "config"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const guildData = data.guild; + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.guild.name, + iconURL: message.guild.iconURL({ + dynamic: true + }) + }) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + // Guild prefix + embed.addField(message.translate("administration/configuration:PREFIX_TITLE"), guildData.prefix); + + // Ignored channels + embed.addField(message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"), guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS")); + + // Autorole plugin + embed.addField(message.translate("administration/configuration:AUTOROLE_TITLE"), guildData.plugins.autorole.enabled ? message.translate("administration/configuration:AUTOROLE_CONTENT", { + roleName: `<@&${guildData.plugins.autorole.role}>` + }) : message.translate("administration/configuration:AUTOROLE_DISABLED")); + + // Welcome plugin + embed.addField(message.translate("administration/configuration:WELCOME_TITLE"), guildData.plugins.welcome.enabled ? message.translate("administration/configuration:WELCOME_CONTENT", { + channel: `<#${guildData.plugins.welcome.channel}>`, + withImage: guildData.plugins.welcome.withImage ? message.translate("common:YES") : message.translate("common:NO") + }) : message.translate("administration/configuration:WELCOME_DISABLED")); + + // Goodbye plugin + embed.addField(message.translate("administration/configuration:GOODBYE_TITLE"), guildData.plugins.goodbye.enabled ? message.translate("administration/configuration:GOODBYE_CONTENT", { + channel: `<#${guildData.plugins.goodbye.channel}>`, + withImage: guildData.plugins.goodbye.withImage ? message.translate("common:YES") : message.translate("common:NO") + }) : message.translate("administration/configuration:GOODBYE_DISABLED")); + + // Special channels + embed.addField(message.translate("administration/configuration:SPECIAL_CHANNELS"), + message.translate("administration/configuration:SUGGESTIONS", { + channel: guildData.plugins.suggestions ? `<#${guildData.plugins.suggestions}>` : message.translate("common:NOT_DEFINED") + }) + "\n" + + message.translate("administration/configuration:REPORTS", { + channel: guildData.plugins.reports ? `<#${guildData.plugins.reports}>` : message.translate("common:NOT_DEFINED") + }) + "\n" + + message.translate("administration/configuration:MODLOGS", { + channel: guildData.plugins.modlogs ? `<#${guildData.plugins.modlogs}>` : message.translate("common:NOT_DEFINED") + }) + "\n" + + message.translate("administration/configuration:BIRTHDAYS", { + channel: guildData.plugins.birthdays ? `<#${guildData.plugins.birthdays}>` : message.translate("common:NOT_DEFINED") + }) + ); + + // Auto sanctions + embed.addField(message.translate("administration/configuration:AUTO_SANCTIONS"), (guildData.plugins.warnsSanctions.kick ? message.translate("administration/configuration:KICK_CONTENT", { + count: guildData.plugins.warnsSanctions.kick + }) : message.translate("administration/configuration:KICK_NOT_DEFINED")) + "\n" + (guildData.plugins.warnsSanctions.ban ? message.translate("administration/configuration:BAN_CONTENT", { + count: guildData.plugins.warnsSanctions.ban + }) : message.translate("administration/configuration:BAN_NOT_DEFINED"))); + + // Automod plugin + embed.addField(message.translate("administration/configuration:AUTOMOD_TITLE"), guildData.plugins.automod.enabled ? message.translate("administration/configuration:AUTOMOD_CONTENT", { + channels: guildData.plugins.automod.ignored.map((ch) => `<#${ch}>`) + }) : message.translate("administration/configuration:AUTOMOD_DISABLED")); + + // Auto-delete mod commands + embed.addField(message.translate("administration/configuration:AUTODELETEMOD"), guildData.autoDeleteModCommands ? message.translate("administration/configuration:AUTODELETEMOD_ENABLED") : message.translate("administration/configuration:AUTODELETEMOD_DISABLED")); + + // Dashboard link + embed.addField(message.translate("administration/configuration:DASHBOARD_TITLE"), `[${message.translate("administration/configuration:DASHBOARD_CONTENT")}](${data.config.dashboard.baseURL})`); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Configuration; \ No newline at end of file diff --git a/TO REWRITE/Administration/deletemod.js b/TO REWRITE/Administration/deletemod.js new file mode 100644 index 00000000..ce4c9500 --- /dev/null +++ b/TO REWRITE/Administration/deletemod.js @@ -0,0 +1,35 @@ +const Command = require("../../base/Command"); + +class Deletemod extends Command { + constructor(client) { + super(client, { + name: "deletemod", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["delm"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const status = args[0]; + if (!status || status !== "on" && status !== "off") return message.error("administration/deletemod:MISSING_STATUS"); + + if (status === "on") { + data.guild.autoDeleteModCommands = true; + data.guild.save(); + message.success("administration/deletemod:ENABLED"); + } else { + data.guild.autoDeleteModCommands = false; + data.guild.save(); + message.success("administration/deletemod:DISABLED"); + } + } +} + +module.exports = Deletemod; \ No newline at end of file diff --git a/TO REWRITE/Administration/goodbye.js b/TO REWRITE/Administration/goodbye.js new file mode 100644 index 00000000..8a2c1573 --- /dev/null +++ b/TO REWRITE/Administration/goodbye.js @@ -0,0 +1,108 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Goodbye extends Command { + constructor(client) { + super(client, { + name: "goodbye", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["gb"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + if (args[0] === "test" && data.guild.plugins.goodbye.enabled) { + this.client.emit("guildMemberRemove", message.member); + return message.success("administration/goodbye:TEST_SUCCESS"); + } + + if ((!args[0] || !["edit", "off"].includes(args[0])) && data.guild.plugins.goodbye.enabled) return message.error("administration/goodbye:MISSING_STATUS"); + + if (args[0] === "off") { + data.guild.plugins.goodbye = { + enabled: false, + message: null, + channelID: null, + withImage: null + }; + data.guild.markModified("plugins.goodbye"); + data.guild.save(); + return message.error("administration/goodbye:DISABLED", { + prefix: data.guild.prefix + }); + } else { + const goodbye = { + enabled: true, + channel: null, + message: null, + withImage: null, + }; + + message.sendT("administration/goodbye:FORM_1", { + author: message.author.toString() + }); + + const filter = m => m.author.id === message.author.id; + const collector = message.channel.createMessageCollector({ + filter, + time: 120000 // 2 minutes + }); + + collector.on("collect", async msg => { + // If the message is filled, it means the user sent yes or no for the image + if (goodbye.message) { + if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) goodbye.withImage = true; + else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) goodbye.withImage = false; + else return message.error("misc:INVALID_YES_NO"); + + data.guild.plugins.goodbye = goodbye; + data.guild.markModified("plugins.goodbye"); + await data.guild.save(); + message.sendT("administration/goodbye:FORM_SUCCESS", { + prefix: data.guild.prefix, + channel: `<#${goodbye.channel}>` + }); + return collector.stop(); + } + + // If the channel is filled and the message is not, it means the user sent the message + if (goodbye.channel && !goodbye.message) { + if (msg.content.length < 1800) { + goodbye.message = msg.content; + return message.sendT("administration/goodbye:FORM_3"); + } + return message.error("administration/goodbye:MAX_CHARACT"); + } + + // If the channel is not filled, it means the user sent it + if (!goodbye.channel) { + const channel = await Resolvers.resolveChannel({ + message: msg, + channelType: "GUILD_TEXT" + }); + if (!channel) return message.error("misc:INVALID_CHANNEL"); + + goodbye.channel = channel.id; + return message.sendT("administration/goodbye:FORM_2", { + channel: channel.toString(), + author: msg.author.tag, + memberCount: msg.guild.memberCount + }); + } + }); + + collector.on("end", (_, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + } + } +} + +module.exports = Goodbye; \ No newline at end of file diff --git a/TO REWRITE/Administration/set.js b/TO REWRITE/Administration/set.js new file mode 100644 index 00000000..013784b5 --- /dev/null +++ b/TO REWRITE/Administration/set.js @@ -0,0 +1,57 @@ +const Command = require("../../base/Command"); + +class Set extends Command { + constructor(client) { + super(client, { + name: "set", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: [], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args) { + const status = args[0]; + if (!status || !["level", "xp", "credits", "bank"].includes(status)) return message.error("administration/set:NO_STATUS"); + + const member = await this.client.resolveMember(args[1], message.guild); + if (!member) return message.error("administration/set:INVALID_MEMBER"); + if (member.user.bot) return message.error("administration/set:BOT_USER"); + + const number = args[2]; + if (!number || isNaN(number) || parseInt(number, 10) < 0) return message.error("administration/set:INVALID_AMOUNT"); + const amount = Math.ceil(parseInt(number, 10)); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + + if (status === "level") { + memberData.level = parseInt(amount, 10); + memberData.save(); + } else if (status === "xp") { + memberData.exp = parseInt(amount, 10); + memberData.save(); + } else if (status === "credits") { + memberData.money = parseInt(amount, 10); + memberData.save(); + } else if (status === "bank") { + memberData.bankSold = parseInt(amount, 10); + memberData.save(); + } + + message.success("administration/set:SUCCESS_" + status.toUpperCase(), { + username: member.user.tag, + amount + }); + } +} + +module.exports = Set; \ No newline at end of file diff --git a/TO REWRITE/Administration/setbirthdays.js b/TO REWRITE/Administration/setbirthdays.js new file mode 100644 index 00000000..660d9091 --- /dev/null +++ b/TO REWRITE/Administration/setbirthdays.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Setbirthdays extends Command { + constructor(client) { + super(client, { + name: "setbirthdays", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setb"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const areBirthdaysEnabled = Boolean(data.guild.plugins.birthdays); + const sentChannel = await Resolvers.resolveChannel({ + message, + search: args.join(" "), + channelType: "GUILD_TEXT" + }); + + if (!sentChannel && areBirthdaysEnabled) { + data.guild.plugins.birthdays = null; + data.guild.markModified("plugins.birthdays"); + await data.guild.save(); + return message.success("administration/setbirthdays:DISABLED"); + } else { + const channel = sentChannel || message.channel; + data.guild.plugins.birthdays = channel.id; + data.guild.markModified("plugins.birthdays"); + await data.guild.save(); + return message.success("administration/setbirthdays:ENABLED", { + channel: channel.toString() + }); + } + } +} + +module.exports = Setbirthdays; \ No newline at end of file diff --git a/TO REWRITE/Administration/setlang.js b/TO REWRITE/Administration/setlang.js new file mode 100644 index 00000000..9c092c77 --- /dev/null +++ b/TO REWRITE/Administration/setlang.js @@ -0,0 +1,33 @@ +const Command = require("../../base/Command"); + +class Setlang extends Command { + constructor(client) { + super(client, { + name: "setlang", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setl"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const language = this.client.languages.find((l) => l.name === args[0] || l.aliases.includes(args[0])); + + if (!args[0] || !language) return message.error("administration/setlang:MISSING_LANG", { list: this.client.languages.map((l) => `\`${l.name} (${l.aliases.slice(0, 2).join(", ")})\``).join(", ") }); + + data.guild.language = language.name; + await data.guild.save(); + + return message.sendT("administration/setlang:SUCCESS", { + lang: language.nativeName + }); + } +} + +module.exports = Setlang; \ No newline at end of file diff --git a/TO REWRITE/Administration/setmodlogs.js b/TO REWRITE/Administration/setmodlogs.js new file mode 100644 index 00000000..6a5cc145 --- /dev/null +++ b/TO REWRITE/Administration/setmodlogs.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Setmodlogs extends Command { + constructor(client) { + super(client, { + name: "setmodlogs", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setm"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const areModLogsEnabled = Boolean(data.guild.plugins.modlogs); + const sentChannel = await Resolvers.resolveChannel({ + message, + search: args.join(" "), + channelType: "GUILD_TEXT" + }); + + if (!sentChannel && areModLogsEnabled) { + data.guild.plugins.modlogs = null; + data.guild.markModified("plugins.modlogs"); + await data.guild.save(); + return message.success("administration/setmodlogs:DISABLED"); + } else { + const channel = sentChannel || message.channel; + data.guild.plugins.modlogs = channel.id; + data.guild.markModified("plugins.modlogs"); + await data.guild.save(); + return message.success("administration/setmodlogs:ENABLED", { + channel: channel.toString() + }); + } + } +} + +module.exports = Setmodlogs; \ No newline at end of file diff --git a/TO REWRITE/Administration/setprefix.js b/TO REWRITE/Administration/setprefix.js new file mode 100644 index 00000000..a680f126 --- /dev/null +++ b/TO REWRITE/Administration/setprefix.js @@ -0,0 +1,33 @@ +const Command = require("../../base/Command"); + +class Setprefix extends Command { + constructor(client) { + super(client, { + name: "setprefix", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setp"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const prefix = args[0]; + if (!prefix) return message.error("administration/setprefix:MISSING_PREFIX"); + if (prefix.length > 5) return message.error("administration/setprefix:TOO_LONG"); + + data.guild.prefix = prefix; + data.guild.save(); + + return message.success("administration/setprefix:SUCCESS", { + prefix + }); + } +} + +module.exports = Setprefix; \ No newline at end of file diff --git a/TO REWRITE/Administration/setreports.js b/TO REWRITE/Administration/setreports.js new file mode 100644 index 00000000..7e73f550 --- /dev/null +++ b/TO REWRITE/Administration/setreports.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Setreports extends Command { + constructor(client) { + super(client, { + name: "setreports", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setr"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const areReportsEnabled = Boolean(data.guild.plugins.reports); + const sentChannel = await Resolvers.resolveChannel({ + message, + search: args.join(" "), + channelType: "GUILD_TEXT" + }); + + if (!sentChannel && areReportsEnabled) { + data.guild.plugins.reports = null; + data.guild.markModified("plugins.reports"); + await data.guild.save(); + return message.success("administration/setreports:DISABLED"); + } else { + const channel = sentChannel || message.channel; + data.guild.plugins.reports = channel.id; + data.guild.markModified("plugins.reports"); + await data.guild.save(); + return message.success("administration/setreports:ENABLED", { + channel: channel.toString() + }); + } + } +} + +module.exports = Setreports; \ No newline at end of file diff --git a/TO REWRITE/Administration/setsuggests.js b/TO REWRITE/Administration/setsuggests.js new file mode 100644 index 00000000..5bdf3664 --- /dev/null +++ b/TO REWRITE/Administration/setsuggests.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Setsuggests extends Command { + constructor(client) { + super(client, { + name: "setsuggests", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setsu"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const areSuggestsEnabled = Boolean(data.guild.plugins.suggestions); + const sentChannel = await Resolvers.resolveChannel({ + message, + search: args.join(" "), + channelType: "GUILD_TEXT" + }); + + if (!sentChannel && areSuggestsEnabled) { + data.guild.plugins.suggestions = null; + data.guild.markModified("plugins.suggestions"); + await data.guild.save(); + return message.success("administration/setsuggests:DISABLED"); + } else { + const channel = sentChannel || message.channel; + data.guild.plugins.suggestions = channel.id; + data.guild.markModified("plugins.suggestions"); + await data.guild.save(); + return message.success("administration/setsuggests:ENABLED", { + channel: channel.toString() + }); + } + } +} + +module.exports = Setsuggests; \ No newline at end of file diff --git a/TO REWRITE/Administration/stealemoji.js b/TO REWRITE/Administration/stealemoji.js new file mode 100644 index 00000000..7c7d3709 --- /dev/null +++ b/TO REWRITE/Administration/stealemoji.js @@ -0,0 +1,39 @@ +const Command = require("../../base/Command"), + { Util } = require("discord.js"); + +class Stealemoji extends Command { + constructor(client) { + super(client, { + name: "stealemoji", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["steale"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + if (!args.length) return message.error("administration/stealemoji:MISSING_EMOJI"); + + for (const rawEmoji of args) { + const parsedEmoji = Util.parseEmoji(rawEmoji); + const extension = parsedEmoji.animated ? "gif" : "png"; + + message.guild.emojis + .create(`https://cdn.discordapp.com/emojis/${parsedEmoji.id}.${extension}`, parsedEmoji.name) + .then(emoji => message.success("administration/stealemoji:SUCCESS", { + emoji: emoji.name + })) + .catch(() => message.error("administration/stealemoji:ERROR", { + emoji: parsedEmoji.name + })); + } + } +} + +module.exports = Stealemoji; \ No newline at end of file diff --git a/TO REWRITE/Administration/welcome.js b/TO REWRITE/Administration/welcome.js new file mode 100644 index 00000000..2e2bd7ad --- /dev/null +++ b/TO REWRITE/Administration/welcome.js @@ -0,0 +1,111 @@ +const Command = require("../../base/Command"), + Resolvers = require("../../helpers/resolvers"); + +class Welcome extends Command { + constructor(client) { + super(client, { + name: "welcome", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["welc"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + if (args[0] === "test" && data.guild.plugins.welcome.enabled) { + this.client.emit("guildMemberAdd", message.member); + return message.success("administration/welcome:TEST_SUCCESS"); + } + + if ((!args[0] || !["edit", "off"].includes(args[0])) && data.guild.plugins.welcome.enabled) return message.error("administration/welcome:MISSING_STATUS"); + + if (args[0] === "off") { + data.guild.plugins.welcome = { + enabled: false, + message: null, + channelID: null, + withImage: null + }; + data.guild.markModified("plugins.welcome"); + data.guild.save(); + return message.error("administration/welcome:DISABLED", { + prefix: data.guild.prefix + }); + } else { + const welcome = { + enabled: true, + channel: null, + message: null, + withImage: null, + }; + + message.sendT("administration/welcome:FORM_1", { + author: message.author.toString() + }); + + const filter = m => m.author.id === message.author.id; + const collector = message.channel.createMessageCollector({ + filter, + time: 120000 // 2 minutes + }); + + collector.on("collect", async msg => { + // If the message is filled, it means the user sent yes or no for the image + if (welcome.message) { + if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { + welcome.withImage = true; + } else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { + welcome.withImage = false; + } else { + return message.error("misc:INVALID_YES_NO"); + } + data.guild.plugins.welcome = welcome; + data.guild.markModified("plugins.welcome"); + await data.guild.save(); + message.sendT("administration/welcome:FORM_SUCCESS", { + prefix: data.guild.prefix, + channel: `<#${welcome.channel}>` + }); + return collector.stop(); + } + + // If the channel is filled and the message is not, it means the user sent the message + if (welcome.channel && !welcome.message) { + if (msg.content.length < 1800) { + welcome.message = msg.content; + return message.sendT("administration/welcome:FORM_3"); + } + return message.error("administration/goodbye:MAX_CHARACT"); + } + + // If the channel is not filled, it means the user sent it + if (!welcome.channel) { + const channel = await Resolvers.resolveChannel({ + message: msg, + channelType: "GUILD_TEXT" + }); + if (!channel) return message.error("misc:INVALID_CHANNEL"); + + welcome.channel = channel.id; + return message.sendT("administration/welcome:FORM_2", { + guildName: message.guild.name, + author: msg.author.tag, + memberCount: msg.guild.memberCount + }); + } + }); + + collector.on("end", (_, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + } + } +} + +module.exports = Welcome; \ No newline at end of file diff --git a/TO REWRITE/Economy/achievements.js b/TO REWRITE/Economy/achievements.js new file mode 100644 index 00000000..ea8c6180 --- /dev/null +++ b/TO REWRITE/Economy/achievements.js @@ -0,0 +1,80 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Achievements extends Command { + constructor(client) { + super(client, { + name: "achievements", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["ac"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let member = message.guild ? message.member : message.author; + if (args[0]) member = await this.client.resolveMember(args[0], message.guild); + if (message.guild && member.user.bot) return message.error("economy/profile:BOT_USER"); + + const userData = (member.id === message.author.id ? data.userData : await this.client.findOrCreateUser({ + id: member.id + })); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/achievements:TITLE") + }) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + embed.addField(message.translate("economy/achievements:SEND_CMD"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.firstCommand.progress.now, + total: userData.achievements.firstCommand.progress.total, + percent: Math.round(100 * (userData.achievements.firstCommand.progress.now / userData.achievements.firstCommand.progress.total)) + })); + embed.addField(message.translate("economy/achievements:CLAIM_SALARY"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.work.progress.now, + total: userData.achievements.work.progress.total, + percent: Math.round(100 * (userData.achievements.work.progress.now / userData.achievements.work.progress.total)) + })); + embed.addField(message.translate("economy/achievements:MARRY"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.married.progress.now, + total: userData.achievements.married.progress.total, + percent: Math.round(100 * (userData.achievements.married.progress.now / userData.achievements.married.progress.total)) + })); + embed.addField(message.translate("economy/achievements:SLOTS"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.slots.progress.now, + total: userData.achievements.slots.progress.total, + percent: Math.round(100 * (userData.achievements.slots.progress.now / userData.achievements.slots.progress.total)) + })); + embed.addField(message.translate("economy/achievements:TIP"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.tip.progress.now, + total: userData.achievements.tip.progress.total, + percent: Math.round(100 * (userData.achievements.tip.progress.now / userData.achievements.tip.progress.total)) + })); + embed.addField(message.translate("economy/achievements:REP"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.rep.progress.now, + total: userData.achievements.rep.progress.total, + percent: Math.round(100 * (userData.achievements.rep.progress.now / userData.achievements.rep.progress.total)) + })); + embed.addField(message.translate("economy/achievements:INVITE"), message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.invite.progress.now, + total: userData.achievements.invite.progress.total, + percent: Math.round(100 * (userData.achievements.invite.progress.now / userData.achievements.invite.progress.total)) + })); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Achievements; \ No newline at end of file diff --git a/TO REWRITE/Economy/birthdate.js b/TO REWRITE/Economy/birthdate.js new file mode 100644 index 00000000..30e12059 --- /dev/null +++ b/TO REWRITE/Economy/birthdate.js @@ -0,0 +1,50 @@ +const Command = require("../../base/Command"); + +class Birthdate extends Command { + constructor(client) { + super(client, { + name: "birthdate", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["bd"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const date = args[0]; + if (!date) return message.error("economy/birthdate:MISSING_DATE"); + + const tArgs = date.split("/"); + const [day, month, year] = tArgs; + if (!day || !month || !year) return message.error("economy/birthdate:INVALID_DATE"); + + const match = date.match(/\d+/g); + if (!match) return message.error("economy/birthdate:INVALID_DATE"); + + const tday = +match[0], + tmonth = +match[1] - 1; + let tyear = +match[2]; + + if (tyear < 100) tyear += tyear < 50 ? 2000 : 1900; + + const d = new Date(tyear, tmonth, tday); + if (!(tday == d.getDate() && tmonth == d.getMonth() && tyear == d.getFullYear())) return message.error("economy/birthdate:INVALID_DATE"); + if (d.getTime() > Date.now()) return message.error("economy/birthdate:DATE_TOO_HIGH"); + if (d.getTime() < (Date.now() - 2.523e+12)) return message.error("economy/birthdate:DATE_TOO_LOW"); + + data.userData.birthdate = d; + data.userData.save(); + + message.success("economy/birthdate:SUCCESS", { + date: this.client.printDate(d) + }); + } +} + +module.exports = Birthdate; \ No newline at end of file diff --git a/TO REWRITE/Economy/deposit.js b/TO REWRITE/Economy/deposit.js new file mode 100644 index 00000000..3cdd2547 --- /dev/null +++ b/TO REWRITE/Economy/deposit.js @@ -0,0 +1,52 @@ +const Command = require("../../base/Command"); + +class Deposit extends Command { + constructor(client) { + super(client, { + name: "deposit", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["bank", "dep"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let amount = args[0]; + + if (!(parseInt(data.memberData.money, 10) > 0)) return message.error("economy/deposit:NO_CREDIT"); + + if (args[0] === "all") { + amount = parseInt(data.memberData.money, 10); + } else { + if (isNaN(amount) || parseInt(amount, 10) < 1) return message.error("economy/deposit:MISSING_AMOUNT"); + amount = parseInt(amount, 10); + } + + if (data.memberData.money < amount) return message.error("economy/deposit:NOT_ENOUGH_CREDIT", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` }); + + const info = { + user: message.translate("economy/transactions:BANK"), + amount: amount, + date: Date.now(), + type: "send" + }; + + data.memberData.transactions.push(info); + + data.memberData.money = data.memberData.money - amount; + data.memberData.bankSold = data.memberData.bankSold + amount; + data.memberData.save(); + + message.success("economy/deposit:SUCCESS", { + money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + }); + } +} + +module.exports = Deposit; \ No newline at end of file diff --git a/TO REWRITE/Economy/divorce.js b/TO REWRITE/Economy/divorce.js new file mode 100644 index 00000000..84aabcf4 --- /dev/null +++ b/TO REWRITE/Economy/divorce.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"); + +class Divorce extends Command { + constructor(client) { + super(client, { + name: "divorce", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["di"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + if (!data.userData.lover) return message.error("economy/divorce:NOT_MARRIED"); + + const user = this.client.users.cache.get(data.userData.lover) || await this.client.users.fetch(data.userData.lover); + + data.userData.lover = null; + data.userData.save(); + + const oldLover = await this.client.findOrCreateUser({ + id: user.id + }); + oldLover.lover = null; + oldLover.save(); + + message.success("economy/divorce:DIVORCED", { + username: user.username + }); + + user.send({ + content: message.translate("economy/divorce:DIVORCED_U", { + username: message.author.username + }) + }); + } +} + +module.exports = Divorce; \ No newline at end of file diff --git a/TO REWRITE/Economy/horserace.js b/TO REWRITE/Economy/horserace.js new file mode 100644 index 00000000..650db328 --- /dev/null +++ b/TO REWRITE/Economy/horserace.js @@ -0,0 +1,184 @@ +const Command = require("../../base/Command"); + +const games = {}; + +class Horserace extends Command { + constructor(client) { + super(client, { + name: "horserace", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["hr"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + if (!args[0]) return message.error("economy/horserace:MISSING_STATUS"); + const author = message.author; + + if (args[0] === "create") { + let thisGame = games[message.channel.id]; + + if (thisGame) return message.error("economy/horserace:GAME_RUNNING"); + else { + games[message.channel.id] = { + horseSpeeds: [], + bets: [] + }; + + thisGame = games[message.channel.id]; + + const f = []; + for (let i = 0; i < 5; i++) { + const speed = this.client.functions.randomNum(1, 5); + const profit = { + 1: 3.5, + 2: 3, + 3: 2.5, + 4: 2, + 5: 1.5, + }; + // const profit = Math.floor((((8.9 / 9) * (6 - speed)) + 1.1) * 10) / 10; + thisGame.horseSpeeds.push(speed); + f.push({ + name: message.translate("economy/horserace:HORSE_NAME", { + number: i + 1 + }), + value: message.translate("economy/horserace:HORSE_VALUE", { + speed, + profit: profit[speed] + }) + }); + } + message.reply({ + embeds: [{ + color: data.config.embed.color, + title: message.translate("economy/horserace:EMBED_T"), + fields: f + }] + }); + } + } else if (args[0] === "bet") { + const thisGame = games[message.channel.id]; + const horse = parseInt(args[1]); + const amount = parseInt(args[2]); + + if (horse > 5) return message.error("economy/horserace:HORSE_NUM"); + if (!thisGame) return message.error("economy/horserace:NO_GAME_RUNNING"); + + if (!amount || isNaN(amount) || parseInt(amount, 10) <= 0) return message.error("economy/pay:INVALID_AMOUNT"); + if (amount > data.memberData.money) return message.error("economy/pay:ENOUGH_MONEY", { + amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}` + }); + + thisGame.bets[author.id] = { + amount, + horse + }; + + message.sendT("economy/horserace:BET", { + user: author, + amount: `**${Math.floor(amount)}** ${message.getNoun(Math.floor(amount), message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}`, + horse + }); + + } else if (args[0] === "go") { + const thisGame = games[message.channel.id]; + const horsePositions = [0, 0, 0, 0, 0]; + + if (!thisGame) return message.error("economy/horserace:NO_GAME_RUNNING"); + + // eslint-disable-next-line no-constant-condition + while (true) { + for (let i = 0; i < 5; i++) { + if (thisGame.horseSpeeds[i] >= Math.floor(Math.random() * 15)) { + horsePositions[i] += 1; + if (horsePositions[i] === 3) { + const winnings = []; + + const profit = { + 1: 3.5, + 2: 3, + 3: 2.5, + 4: 2, + 5: 1.5, + }; + + // const profit = Math.floor((((8.9 / 9) * (6 - thisGame.horseSpeeds[i])) + 1.1) * 10) / 10; + + for (let j = 0; j < Object.keys(thisGame.bets).length; j++) { + if (Object.values(thisGame.bets)[j].horse === i + 1) { + winnings.push([Object.keys(thisGame.bets)[j], Object.values(thisGame.bets)[j].amount * profit[thisGame.horseSpeeds[i]]]); + } + } + + if (winnings.length === 0) { + for (let j = 0; j < Object.keys(thisGame.bets).length; j++) { + if (Object.values(thisGame.bets)[j].horse !== i + 1) { + const memberData = await this.client.findOrCreateMember({ + id: Object.keys(thisGame.bets)[j], + guildID: message.guild.id + }); + + const info = { + user: message.translate("economy/transactions:HORSERACE"), + amount: Object.values(thisGame.bets)[j].amount, + date: Date.now(), + type: "send" + }; + + memberData.transactions.push(info); + memberData.money -= Object.values(thisGame.bets)[j].amount; + } + } + + message.sendT("economy/horserace:NO_WINNERS", { + horse: i + 1 + }); + } else { + let winners = ""; + for (let j = 0; j < winnings.length; j++) { + winners += `\n<@${winnings[j][0]}> выиграл **${Math.floor(winnings[j][1])}** ${message.getNoun(Math.floor(winnings[j][1]), message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}!`; + + const memberData = await this.client.findOrCreateMember({ + id: winnings[j][0], + guildID: message.guild.id + }); + + const toAdd = Math.floor(winnings[j][1]) - Object.values(thisGame.bets)[j].amount; + + const info = { + user: message.translate("economy/transactions:HORSERACE"), + amount: toAdd, + date: Date.now(), + type: "got" + }; + + memberData.transactions.push(info); + memberData.money += toAdd; + memberData.save(); + } + + message.sendT("economy/horserace:WINNERS", { + horse: i + 1, + winners + }); + } + + delete games[message.channel.id]; + return; + } + } + } + } + } + } +} + +module.exports = Horserace; \ No newline at end of file diff --git a/TO REWRITE/Economy/leaderboard.js b/TO REWRITE/Economy/leaderboard.js new file mode 100644 index 00000000..627184bd --- /dev/null +++ b/TO REWRITE/Economy/leaderboard.js @@ -0,0 +1,174 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Leaderboard extends Command { + constructor(client) { + super(client, { + name: "leaderboard", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["lb"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const isOnMobile = (message.member.presence.clientStatus ? JSON.stringify(Object.keys(message.member.presence.clientStatus)) === JSON.stringify(["mobile"]) : false); + + const type = args[0]; + if (!type || !["credits", "level", "rep"].includes(type)) return message.error("economy/leaderboard:MISSING_TYPE"); + + if (type === "credits") { + const members = await this.client.membersData.find({ + guildID: message.guild.id + }).lean(), + membersLeaderboard = members.map((m) => { + return { + id: m.id, + money: m.money + m.bankSold + }; + }).sort((a, b) => b.money - a.money); + if (membersLeaderboard.length > 20) membersLeaderboard.length = 20; + + let userNames = ""; + let money = ""; + for (let i = 0; i < membersLeaderboard.length; i++) { + const data = membersLeaderboard[i]; + const user = (await this.client.users.fetch(data.id)).tag; + + userNames += `**${i + 1}**. ${user}\n`; + money += `${data.money}\n`; + } + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/leaderboard:TABLE", { + name: message.guild.name + }), + iconURL: message.guild.iconURL({ + dynamic: true + }) + }) + .setColor(data.config.embed.color) + .addFields({ + name: message.translate("economy/leaderboard:TOP"), + value: userNames, + inline: true + }, { + name: message.translate("common:CREDITS"), + value: money, + inline: true + }); + + message.reply({ + embeds: [embed] + }); + } else if (type === "level") { + const members = await this.client.membersData.find({ + guildID: message.guild.id + }).lean(), + membersLeaderboard = members.map((m) => { + return { + id: m.id, + level: m.level, + xp: m.exp + }; + }).sort((a, b) => b.level - a.level); + if (membersLeaderboard.length > 20) membersLeaderboard.length = 20; + + let userNames = ""; + let level = ""; + let xp = ""; + for (let i = 0; i < membersLeaderboard.length; i++) { + const data = membersLeaderboard[i]; + const user = (await this.client.users.fetch(data.id)).tag; + + userNames += `**${i + 1}**. ${user}\n`; + level += `${data.level}\n`; + xp += `${data.xp} / ${5 * (data.level * data.level) + 80 * data.level + 100}\n`; + } + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/leaderboard:TABLE", { + name: message.guild.name + }), + iconURL: message.guild.iconURL({ + dynamic: true + }) + }) + .setColor(data.config.embed.color) + .addFields({ + name: message.translate("economy/leaderboard:TOP"), + value: userNames, + inline: true + }, { + name: message.translate("common:LEVEL"), + value: level, + inline: true + }, { + name: message.translate("common:XP"), + value: xp, + inline: true + }); + + message.reply({ + embeds: [embed] + }); + } else if (type === "rep") { + const users = await this.client.usersData.find({ + rep: { $gt: 0 } + }).lean(), + usersLeaderboard = users.map((u) => { + return { + id: u.id, + rep: u.rep + }; + }).sort((a, b) => b.rep - a.rep); + if (usersLeaderboard.length > 20) usersLeaderboard.length = 20; + + let userNames = ""; + let rep = ""; + for (let i = 0; i < usersLeaderboard.length; i++) { + const data = usersLeaderboard[i]; + const user = (await this.client.users.fetch(data.id)).tag; + + userNames += `**${i + 1}**. ${user}\n`; + rep += `${data.rep}\n`; + } + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/leaderboard:TABLE", { + name: message.guild.name + }), + iconURL: message.guild.iconURL({ + dynamic: true + }) + }) + .setColor(data.config.embed.color) + .addFields({ + name: message.translate("economy/leaderboard:TOP"), + value: userNames, + inline: true + }, { + name: message.translate("common:REP"), + value: rep, + inline: true + }); + + message.reply({ + embeds: [embed] + }); + } + + if (isOnMobile) message.sendT("economy/leaderboard:MOBILE"); + } +} + +module.exports = Leaderboard; \ No newline at end of file diff --git a/TO REWRITE/Economy/marry.js b/TO REWRITE/Economy/marry.js new file mode 100644 index 00000000..2ad02c54 --- /dev/null +++ b/TO REWRITE/Economy/marry.js @@ -0,0 +1,134 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +const pendings = {}; + +class Marry extends Command { + constructor(client) { + super(client, { + name: "marry", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + if (data.userData.lover) return message.error("economy/marry:ALREADY_MARRIED", { prefix: data.guild.prefix }); + + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("economy/marry:INVALID_MEMBER"); + + const userData = await this.client.findOrCreateUser({ + id: member.id + }); + + if (userData.lover) return message.error("economy/marry:ALREADY_MARRIED_USER", { username: member.user.tag }); + if (member.user.bot) return message.error("economy/marry:BOT_USER"); + if (member.id === message.author.id) return message.error("economy/marry:YOURSELF"); + + for (const requester in pendings) { + const receiver = pendings[requester]; + // If the member already sent a request to someone + if (requester === message.author.id) { + const user = this.client.users.cache.get(receiver) || await this.client.users.fetch(receiver); + return message.error("economy/marry:REQUEST_AUTHOR_TO_AMEMBER", { + username: user.tag + }); + } else if (receiver === message.author.id) { // If there is a pending request for this member + const user = this.client.users.cache.get(requester) || await this.client.users.fetch(requester); + return message.error("economy/marry:REQUEST_AMEMBER_TO_AUTHOR", { + username: user.tag + }); + } else if (requester === member.id) { // If the asked member has sent pending request + const user = this.client.users.cache.get(receiver) || await this.client.users.fetch(receiver); + return message.error("economy/marry:REQUEST_AMEMBER_TO_MEMBER", { + firstUsername: member.user.tag, + secondUsername: user.tag + }); + } else if (receiver === member.id) { // If there is a pending request for the asked member + const user = this.client.users.cache.get(requester) || await this.client.users.fetch(requester); + return message.error("economy/marry:REQUEST_MEMBER_TO_AMEMBER", { + firstUsername: member.user.tag, + secondUsername: user.tag + }); + } + } + + // Update pending requests + pendings[message.author.id] = member.id; + + message.sendT("economy/marry:REQUEST", { + from: message.author.toString(), + to: member.user.toString() + }); + + const filter = m => m.author.id === member.id; + const collector = new Discord.MessageCollector(message.channel, { + filter, + time: 120000 + }); + + collector.on("collect", (msg) => { + if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { + return collector.stop(true); + } else if (msg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { + return collector.stop(false); + } else { + return message.error("misc:INVALID_YES_NO"); + } + }); + + collector.on("end", async (_collected, reason) => { + // Delete pending request + delete pendings[message.author.id]; + if (reason === "time") return message.error("economy/marry:TIMEOUT", { username: member.user.toString() }); + if (reason) { + data.userData.lover = member.id; + await data.userData.save(); + userData.lover = message.author.id; + await userData.save(); + const messageOptions = { + content: `${member.toString()} :heart: ${message.author.toString()}`, + files: [{ + name: "achievement_unlocked3.png", + attachment: "./assets/img/achievements/achievement_unlocked3.png" + }] + }; + let sent = false; + if (!userData.achievements.married.achieved) { + message.channel.send(messageOptions); + sent = true; + userData.achievements.married.achieved = true; + userData.achievements.married.progress.now = 1; + userData.markModified("achievements.married"); + userData.save(); + } + if (!data.userData.achievements.married.achieved) { + if (!sent) message.channel.send(messageOptions); + data.userData.achievements.married.achieved = true; + data.userData.achievements.married.progress.now = 1; + data.userData.markModified("achievements.married"); + data.userData.save(); + } + return message.success("economy/marry:SUCCESS", { + creator: message.author.toString(), + partner: member.user.toString() + }); + } else { + return message.success("economy/marry:DENIED", { + creator: message.author.toString(), + partner: member.user.toString() + }); + } + }); + } +} + +module.exports = Marry; \ No newline at end of file diff --git a/TO REWRITE/Economy/money.js b/TO REWRITE/Economy/money.js new file mode 100644 index 00000000..d173f229 --- /dev/null +++ b/TO REWRITE/Economy/money.js @@ -0,0 +1,75 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +const asyncForEach = async (collection, callback) => { + const allPromises = collection.map(async key => { + await callback(key); + }); + + return await Promise.all(allPromises); +}; + +class Money extends Command { + constructor(client) { + super(client, { + name: "money", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["balance", "mon"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let member = await this.client.resolveMember(args[0], message.guild); + if (!member) member = message.member; + const user = member.user; + + if (user.bot) return message.error("misc:BOT_USER"); + + const memberData = (message.author === user) ? data.memberData : await this.client.findOrCreateMember({ + id: user.id, + guildID: message.guild.id + }); + + const commonsGuilds = this.client.guilds.cache.filter((g) => g.members.cache.get(user.id)); + let globalMoney = 0; + await asyncForEach(commonsGuilds, async (guild) => { + const data = await this.client.findOrCreateMember({ + id: user.id, + guildID: guild.id + }); + globalMoney += data.money; + globalMoney += data.bankSold; + }); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/money:TITLE", { + username: member.user.username + }), + iconURL: member.user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Money; \ No newline at end of file diff --git a/TO REWRITE/Economy/number.js b/TO REWRITE/Economy/number.js new file mode 100644 index 00000000..333b35af --- /dev/null +++ b/TO REWRITE/Economy/number.js @@ -0,0 +1,97 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +const currentGames = {}; + +class Number extends Command { + constructor(client) { + super(client, { + name: "number", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["num"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + if (currentGames[message.guild.id]) return message.error("economy/number:GAME_RUNNING"); + + const participants = [], + number = this.client.functions.randomNum(1000, 6000); + + await message.sendT("economy/number:GAME_START"); + + // Store the date wich the game has started + const gameCreatedAt = Date.now(); + + const filter = m => !m.author.bot; + const collector = new Discord.MessageCollector(message.channel, { + filter, + time: 480000 // 8 minutes + }); + currentGames[message.guild.id] = true; + + collector.on("collect", async msg => { + if (!participants.includes(msg.author.id)) participants.push(msg.author.id); + if (msg.content === "STOP") return collector.stop("force"); + if (isNaN(msg.content)) return; + + const parsedNumber = parseInt(msg.content, 10); + + if (parsedNumber === number) { + const time = this.client.convertTime(message.guild, Date.now() - gameCreatedAt); + message.sendT("economy/number:GAME_STATS", { + winner: msg.author.toString(), + number, + time, + participantCount: participants.length, + participants: participants.map(p => `<@${p}>`).join(", ") + }); + + if (participants.length > 1 && data.guild.disabledCategories && !data.guild.disabledCategories.includes("Economy")) { + const won = 100 * (participants.length * 0.5); + + message.sendT("economy/number:WON", { + winner: msg.author.username, + credits: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + }); + + const memberData = await this.client.findOrCreateMember({ + id: msg.author.id, + guildID: message.guild.id + }); + + const info = { + user: message.translate("economy/transactions:NUMBERS"), + amount: won, + date: Date.now(), + type: "got" + }; + + data.memberData.transactions.push(info); + + memberData.money += won; + memberData.save(); + } + + collector.stop(); + } + if (parseInt(msg.content) < number) message.error("economy/number:BIG", { user: msg.author.toString(), number: parsedNumber }); + if (parseInt(msg.content) > number) message.error("economy/number:SMALL", { user: msg.author.toString(), number: parsedNumber }); + }); + + collector.on("end", (_collected, reason) => { + delete currentGames[message.guild.id]; + if (reason === "time") return message.error("economy/number:DEFEAT", { number }); + else if (reason === "force") return message.error("misc:FORCE_STOP", { user: message.author.toString() }); + }); + } +} + +module.exports = Number; \ No newline at end of file diff --git a/TO REWRITE/Economy/pay.js b/TO REWRITE/Economy/pay.js new file mode 100644 index 00000000..0afd9c9c --- /dev/null +++ b/TO REWRITE/Economy/pay.js @@ -0,0 +1,59 @@ +const Command = require("../../base/Command"); + +class Pay extends Command { + constructor(client) { + super(client, { + name: "pay", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("economy/pay:INVALID_MEMBER"); + if (member.user.bot) return message.error("economy/pay:BOT_USER"); + if (member.id === message.author.id) return message.error("economy/pay:YOURSELF"); + + const sentAmount = args[1]; + if (!sentAmount || isNaN(sentAmount) || parseInt(sentAmount, 10) <= 0) return message.error("economy/pay:INVALID_AMOUNT"); + + const amount = Math.ceil(parseInt(sentAmount, 10)); + if (amount > data.memberData.money) return message.error("economy/pay:ENOUGH_MONEY", { + amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDITS:1"), message.translate("misc:NOUNS:CREDITS:2"), message.translate("misc:NOUNS:CREDITS:5"))}` + }); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + + const info = { + user: member.user.tag, + amount: parseInt(amount, 10), + date: Date.now(), + type: "send" + }; + + data.memberData.transactions.push(info); + data.memberData.money = data.memberData.money - parseInt(amount, 10); + data.memberData.save(); + + memberData.money = memberData.money + parseInt(amount, 10); + memberData.save(); + + message.success("economy/pay:SUCCESS", { + amount: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + username: member.user.tag + }); + } +} + +module.exports = Pay; \ No newline at end of file diff --git a/TO REWRITE/Economy/profile.js b/TO REWRITE/Economy/profile.js new file mode 100644 index 00000000..45e564b1 --- /dev/null +++ b/TO REWRITE/Economy/profile.js @@ -0,0 +1,98 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +const asyncForEach = async (collection, callback) => { + const allPromises = collection.map(async key => { + await callback(key); + }); + + return await Promise.all(allPromises); +}; + +class Profile extends Command { + constructor(client) { + super(client, { + name: "profile", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["prof"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const arg = args[0] || message.author; + let member = await this.client.resolveMember(arg, message.guild); + if (!member) member = message.member; + if (member.user.bot) return message.error("economy/profile:BOT_USER"); + + const memberData = (member.id === message.author.id ? data.memberData : await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + })); + const userData = (member.id === message.author.id ? data.userData : await this.client.findOrCreateUser({ + id: member.id + })); + if (userData.lover && !this.client.users.cache.get(userData.lover)) await this.client.users.fetch(userData.lover, true); + + const commonsGuilds = this.client.guilds.cache.filter((g) => g.members.cache.get(member.id)); + let globalMoney = 0; + await asyncForEach(commonsGuilds, async (guild) => { + const data = await this.client.findOrCreateMember({ + id: member.id, + guildID: guild.id + }); + globalMoney += data.money; + globalMoney += data.bankSold; + }); + + const profileEmbed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/profile:TITLE", { + username: member.user.tag + }), + iconURL: member.user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setImage("attachment://achievements.png") + .addField(this.client.customEmojis.link + " " + message.translate("economy/profile:LINK"), `[${message.translate("economy/profile:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/user/${member.user.id}/${message.guild.id})`) + .addField(message.translate("economy/profile:BIO"), userData.bio ? userData.bio : message.translate("economy/profile:NO_BIO")) + .addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .addField(message.translate("economy/profile:REPUTATION"), `**${userData.rep}** ${message.getNoun(userData.rep, message.translate("misc:NOUNS:POINTS:1"), message.translate("misc:NOUNS:POINTS:2"), message.translate("misc:NOUNS:POINTS:5"))}`, true) + .addField(message.translate("economy/profile:LEVEL"), `**${memberData.level}**`, true) + .addField(message.translate("economy/profile:EXP"), `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`, true) + .addField(message.translate("economy/profile:REGISTERED"), this.client.printDate(new Date(memberData.registeredAt)), true) + .addField(message.translate("economy/profile:BIRTHDATE"), (!userData.birthdate ? message.translate("economy/profile:NO_BIRTHDATE") : this.client.printDate(new Date(userData.birthdate))), true) + .addField(message.translate("economy/profile:LOVER"), (!userData.lover ? message.translate("economy/profile:NO_LOVER") : this.client.users.cache.get(userData.lover).tag), true) + .addField(message.translate("economy/profile:ACHIEVEMENTS"), message.translate("economy/profile:ACHIEVEMENTS_CONTENT", { + prefix: data.guild.prefix + })) + .setColor(data.config.embed.color) // Sets the color of the embed + .setFooter({ + text: data.config.embed.footer + }) // Sets the footer of the embed + .setTimestamp(); + + const buffer = await userData.getAchievements(); + + message.reply({ + embeds: [profileEmbed], + files: [{ + name: "achievements.png", + attachment: buffer + }] + }); + } +} + +module.exports = Profile; \ No newline at end of file diff --git a/TO REWRITE/Economy/rep.js b/TO REWRITE/Economy/rep.js new file mode 100644 index 00000000..dc4ba37f --- /dev/null +++ b/TO REWRITE/Economy/rep.js @@ -0,0 +1,71 @@ +const Command = require("../../base/Command"); + +class Rep extends Command { + constructor(client) { + super(client, { + name: "rep", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["reputation"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + // if the member is already in the cooldown db + const isInCooldown = (data.userData.cooldowns || { + rep: 0 + }).rep; + if (isInCooldown) { + /*if the timestamp recorded in the database indicating + when the member will be able to execute the order again + is greater than the current date, display an error message */ + if (isInCooldown > Date.now()) return message.error("economy/rep:COOLDOWN", { + time: this.client.convertTime(isInCooldown, "to", true) + }); + } + + const user = await this.client.resolveUser(args[0]); + if (!user) return message.error("economy/rep:INVALID_USER"); + if (user.bot) return message.error("economy/rep:BOT_USER"); + if (user.id === message.author.id) return message.error("economy/rep:YOURSELF"); + + // Records in the database the time when the member will be able to execute the command again (in 12 hours) + const toWait = Date.now() + 21600000; + data.userData.cooldowns = {}; + data.userData.cooldowns.rep = toWait; + data.userData.markModified("cooldowns"); + data.userData.save(); + + const userData = await this.client.findOrCreateUser({ + id: user.id + }); + userData.rep++; + if (!userData.achievements.rep.achieved) { + userData.achievements.rep.progress.now = (userData.rep > userData.achievements.rep.progress.total ? userData.achievements.rep.progress.total : userData.rep); + if (userData.achievements.rep.progress.now >= userData.achievements.rep.progress.total) { + userData.achievements.rep.achieved = true; + message.channel.send({ + content: `${user}`, + files: [{ + name: "achievement_unlocked6.png", + attachment: "./assets/img/achievements/achievement_unlocked6.png" + }] + }); + } + userData.markModified("achievements.rep"); + } + await userData.save(); + + message.success("economy/rep:SUCCESS", { + username: user.username + }); + } +} + +module.exports = Rep; \ No newline at end of file diff --git a/TO REWRITE/Economy/rob.js b/TO REWRITE/Economy/rob.js new file mode 100644 index 00000000..ea682ba1 --- /dev/null +++ b/TO REWRITE/Economy/rob.js @@ -0,0 +1,78 @@ +const Command = require("../../base/Command"); + +class Rob extends Command { + constructor(client) { + super(client, { + name: "rob", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["steal"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("economy/rob:MISSING_MEMBER"); + if (member.id === message.author.id) return message.error("economy/rob:YOURSELF"); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + const isInCooldown = memberData.cooldowns.rob || 0; + if (isInCooldown) { + if (isInCooldown > Date.now()) return message.error("economy/rob:COOLDOWN", { user: member.user }); + } + + let amountToRob = args[1]; + if (!amountToRob || isNaN(amountToRob) || parseInt(amountToRob, 10) <= 0) return message.error("economy/rob:MISSING_AMOUNT", { user: member.user }); + + amountToRob = Math.floor(parseInt(amountToRob, 10)); + + if (amountToRob > memberData.money) return message.error("economy/rob:NOT_ENOUGH_MEMBER", { user: member.user }); + + const potentiallyLose = Math.floor(amountToRob * 1.5); + if (potentiallyLose > data.memberData.money) return message.error("economy/rob:NOT_ENOUGH_AUTHOR", { + moneyMin: `${potentiallyLose} ${message.getNoun(potentiallyLose, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + moneyCurrent: `${data.memberData.money} ${message.getNoun(data.memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + }); + + const itsAWon = Math.floor(this.client.functions.randomNum(0, 100) < 25); + + if (itsAWon) { + const toWait = Date.now() + 6 * (60 * 60000); // 6 hours + memberData.cooldowns.rob = toWait; + memberData.markModified("cooldowns"); + await memberData.save(); + const randomNum = this.client.functions.randomNum(1, 2); + message.sendT("economy/rob:ROB_WON_" + randomNum, { + money: `${amountToRob} ${message.getNoun(amountToRob, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + user: member.user + }); + data.memberData.money += amountToRob; + memberData.money -= amountToRob, 10; + memberData.save(); + data.memberData.save(); + } else { + const won = Math.floor(0.9 * amountToRob); + const randomNum = this.client.functions.randomNum(1, 2); + message.sendT("economy/rob:ROB_LOSE_" + randomNum, { + fine: `${potentiallyLose} ${message.getNoun(potentiallyLose, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + offset: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + user: member.user + }); + data.memberData.money -= potentiallyLose; + memberData.money += won; + memberData.save(); + data.memberData.save(); + } + } +} + +module.exports = Rob; \ No newline at end of file diff --git a/TO REWRITE/Economy/setbio.js b/TO REWRITE/Economy/setbio.js new file mode 100644 index 00000000..d3e8998e --- /dev/null +++ b/TO REWRITE/Economy/setbio.js @@ -0,0 +1,30 @@ +const Command = require("../../base/Command"); + +class Setbio extends Command { + constructor(client) { + super(client, { + name: "setbio", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["biography", "setdesc", "sb"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const newBio = args.join(" "); + if (!newBio) return message.error("economy/setbio:MISSING"); + if (newBio.length > 100) return message.error("economy/setbio:MAX_CHARACT"); + + data.userData.bio = newBio; + message.success("economy/setbio:SUCCESS"); + await data.userData.save(); + } +} + +module.exports = Setbio; \ No newline at end of file diff --git a/TO REWRITE/Economy/slots.js b/TO REWRITE/Economy/slots.js new file mode 100644 index 00000000..31fe1e4c --- /dev/null +++ b/TO REWRITE/Economy/slots.js @@ -0,0 +1,208 @@ +const Command = require("../../base/Command"); + +class Slots extends Command { + constructor(client) { + super(client, { + name: "slots", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["casino", "slot"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const fruits = ["🍎", "🍐", "🍌", "🍇", "🍉", "🍒", "🍓"]; + + let i1 = 0, j1 = 0, k1 = 0, + i2 = 1, j2 = 1, k2 = 1, + i3 = 2, j3 = 2, k3 = 2; + + // Gets three random fruits array + const colonnes = [ + this.client.functions.shuffle(fruits), + this.client.functions.shuffle(fruits), + this.client.functions.shuffle(fruits) + ]; + + // Gets the amount provided + let amount = args[0]; + if (!amount || isNaN(amount) || amount < 1) amount = 50; + if (amount > data.memberData.money) return message.error("economy/slots:NOT_ENOUGH", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` }); + + amount = Math.round(amount); + + function getCredits(number, isJackpot) { + if (!isJackpot) number = number * 1.5; + else if (isJackpot) number = number * 5; + + return Math.round(number); + } + + const tmsg = await message.sendT("misc:PLEASE_WAIT", null, { + prefixEmoji: "loading" + }); + editMsg(); + + const interval = setInterval(editMsg, 1000); + + setTimeout(() => { + clearInterval(interval); + end(tmsg); + }, 4000); + + async function end() { + let msg = "[ :slot_machine: | **СЛОТЫ** ]\n------------------\n"; + + i1 = (i1 < fruits.length - 1) ? i1 + 1 : 0; + i2 = (i2 < fruits.length - 1) ? i2 + 1 : 0; + i3 = (i3 < fruits.length - 1) ? i3 + 1 : 0; + j1 = (j1 < fruits.length - 1) ? j1 + 1 : 0; + j2 = (j2 < fruits.length - 1) ? j2 + 1 : 0; + j3 = (j3 < fruits.length - 1) ? j3 + 1 : 0; + k1 = (k1 < fruits.length - 1) ? k1 + 1 : 0; + k2 = (k2 < fruits.length - 1) ? k2 + 1 : 0; + k3 = (k3 < fruits.length - 1) ? k3 + 1 : 0; + + msg += colonnes[0][i1] + " : " + colonnes[1][j1] + " : " + colonnes[2][k1] + "\n"; + msg += colonnes[0][i2] + " : " + colonnes[1][j2] + " : " + colonnes[2][k2] + " **<**\n"; + msg += colonnes[0][i3] + " : " + colonnes[1][j3] + " : " + colonnes[2][k3] + "\n------------------\n"; + + if ((colonnes[0][i2] == colonnes[1][j2]) && (colonnes[1][j2] == colonnes[2][k2])) { + msg += "| : : : **" + (message.translate("common:VICTORY").toUpperCase()) + "** : : : |"; + tmsg.edit(msg); + const credits = getCredits(amount, true); + message.channel.send({ + content: "**!! ДЖЕКПОТ !!**\n" + message.translate("economy/slots:VICTORY", { + money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + won: `**${credits}** ${message.getNoun(credits, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + username: message.author.username + }) + }); + + const toAdd = credits - amount; + + const info = { + user: message.translate("economy/slots:DESCRIPTION"), + amount: toAdd, + date: Date.now(), + type: "got" + }; + + data.memberData.transactions.push(info); + + data.memberData.money = data.memberData.money + toAdd; + if (!data.userData.achievements.slots.achieved) { + data.userData.achievements.slots.progress.now += 1; + if (data.userData.achievements.slots.progress.now === data.userData.achievements.slots.progress.total) { + data.userData.achievements.slots.achieved = true; + message.reply({ + files: [{ + name: "achievement_unlocked4.png", + attachment: "./assets/img/achievements/achievement_unlocked4.png" + }] + }); + } + data.userData.markModified("achievements.slots"); + await data.userData.save(); + } + await data.memberData.save(); + return; + } + + if (colonnes[0][i2] == colonnes[1][j2] || colonnes[1][j2] == colonnes[2][k2] || colonnes[0][i2] == colonnes[2][k2]) { + msg += "| : : : **" + (message.translate("common:VICTORY").toUpperCase()) + "** : : : |"; + tmsg.edit(msg); + const credits = getCredits(amount, false); + message.channel.send({ + content: message.translate("economy/slots:VICTORY", { + money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + won: `**${credits}** ${message.getNoun(credits, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + username: message.author.username + }) + }); + const toAdd = credits - amount; + + const info = { + user: message.translate("economy/slots:DESCRIPTION"), + amount: toAdd, + date: Date.now(), + type: "got" + }; + + data.memberData.transactions.push(info); + + data.memberData.money = data.memberData.money + toAdd; + if (!data.userData.achievements.slots.achieved) { + data.userData.achievements.slots.progress.now += 1; + if (data.userData.achievements.slots.progress.now === data.userData.achievements.slots.progress.total) { + data.userData.achievements.slots.achieved = true; + message.reply({ + files: [{ + name: "achievement_unlocked4.png", + attachment: "./assets/img/achievements/achievement_unlocked4.png" + }] + }); + } + data.userData.markModified("achievements.slots"); + await data.userData.save(); + } + await data.memberData.save(); + return; + } + + msg += "| : : : **" + (message.translate("common:DEFEAT").toUpperCase()) + "** : : : |"; + message.channel.send({ + content: message.translate("economy/slots:DEFEAT", { + money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + username: message.author.username + }) + }); + + const info = { + user: message.translate("economy/slots:DESCRIPTION"), + amount: amount, + date: Date.now(), + type: "send" + }; + + data.memberData.transactions.push(info); + + data.memberData.money = data.memberData.money - amount; + if (!data.userData.achievements.slots.achieved) { + data.userData.achievements.slots.progress.now = 0; + data.userData.markModified("achievements.slots"); + await data.userData.save(); + } + await data.memberData.save(); + return; + } + + function editMsg() { + let msg = "[ :slot_machine: | **СЛОТЫ** ]\n------------------\n"; + + i1 = (i1 < fruits.length - 1) ? i1 + 1 : 0; + i2 = (i2 < fruits.length - 1) ? i2 + 1 : 0; + i3 = (i3 < fruits.length - 1) ? i3 + 1 : 0; + j1 = (j1 < fruits.length - 1) ? j1 + 1 : 0; + j2 = (j2 < fruits.length - 1) ? j2 + 1 : 0; + j3 = (j3 < fruits.length - 1) ? j3 + 1 : 0; + k1 = (k1 < fruits.length - 1) ? k1 + 1 : 0; + k2 = (k2 < fruits.length - 1) ? k2 + 1 : 0; + k3 = (k3 < fruits.length - 1) ? k3 + 1 : 0; + + msg += colonnes[0][i1] + " : " + colonnes[1][j1] + " : " + colonnes[2][k1] + "\n"; + msg += colonnes[0][i2] + " : " + colonnes[1][j2] + " : " + colonnes[2][k2] + " **<**\n"; + msg += colonnes[0][i3] + " : " + colonnes[1][j3] + " : " + colonnes[2][k3] + "\n"; + + tmsg.edit(msg); + } + } +} + +module.exports = Slots; \ No newline at end of file diff --git a/TO REWRITE/Economy/tictactoe.js b/TO REWRITE/Economy/tictactoe.js new file mode 100644 index 00000000..e011cdd9 --- /dev/null +++ b/TO REWRITE/Economy/tictactoe.js @@ -0,0 +1,46 @@ +const Command = require("../../base/Command"), + tictactoe = require("../../helpers/tictactoe"); + +class TicTacToe extends Command { + constructor(client) { + super(client, { + name: "tictactoe", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["ttt"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + tictactoe(message, { + resultBtn: true, + embedColor: data.config.embed.color, + embedFoot: data.config.embed.footer + }).then(async winner => { + const memberData = await this.client.findOrCreateMember({ + id: winner.id, + guildID: message.guild.id + }); + + const info = { + user: message.translate("economy/transactions:TTT"), + amount: 100, + date: Date.now(), + type: "got" + }; + + memberData.transactions.push(info); + + memberData.money += 100; + memberData.save(); + }); + } +} + +module.exports = TicTacToe; \ No newline at end of file diff --git a/TO REWRITE/Economy/transactions.js b/TO REWRITE/Economy/transactions.js new file mode 100644 index 00000000..426f79ec --- /dev/null +++ b/TO REWRITE/Economy/transactions.js @@ -0,0 +1,56 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Transactions extends Command { + constructor(client) { + super(client, { + name: "transactions", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["tr"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("economy/transactions:EMBED_TRANSACTIONS"), + iconURL: message.author.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + const transactions = data.memberData.transactions, + sortedTransactions = [ [], [] ]; + + transactions.slice(-20).forEach((t) => { + const array = t.type === "got" ? sortedTransactions[0] : sortedTransactions[1]; + array.push(`${message.translate("economy/transactions:T_USER_" + t.type.toUpperCase())}: ${t.user}\n${message.translate("economy/transactions:T_AMOUNT")}: ${t.amount}\n${message.translate("economy/transactions:T_DATE")}: ${this.client.printDate(t.date, "Do MMMM YYYY, HH:mm")}\n`); + }); + + if (transactions.length < 1) { + embed.setDescription(message.translate("economy/transactions:NO_TRANSACTIONS")); + } else { + if (sortedTransactions[0].length > 0) embed.addField(message.translate("economy/transactions:T_GOT"), sortedTransactions[0].join("\n"), true); + if (sortedTransactions[1].length > 0) embed.addField(message.translate("economy/transactions:T_SEND"), sortedTransactions[1].join("\n"), true); + } + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Transactions; \ No newline at end of file diff --git a/TO REWRITE/Economy/withdraw.js b/TO REWRITE/Economy/withdraw.js new file mode 100644 index 00000000..f19dc6ad --- /dev/null +++ b/TO REWRITE/Economy/withdraw.js @@ -0,0 +1,52 @@ +const Command = require("../../base/Command"); + +class Withdraw extends Command { + constructor(client) { + super(client, { + name: "withdraw", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["wd"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let amount = args[0]; + + if (!(parseInt(data.memberData.bankSold, 10) > 0)) return message.error("economy/withdraw:NO_CREDIT"); + + if (args[0] === "all") { + amount = parseInt(data.memberData.bankSold, 10); + } else { + if (isNaN(amount) || parseInt(amount, 10) < 1) return message.error("economy/withdraw:MISSING_AMOUNT"); + amount = parseInt(amount, 10); + } + + if (data.memberData.bankSold < amount) return message.error("economy/withdraw:NOT_ENOUGH", { money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` }); + + const info = { + user: message.translate("economy/transactions:BANK"), + amount: amount, + date: Date.now(), + type: "got" + }; + + data.memberData.transactions.push(info); + + data.memberData.money = data.memberData.money + amount; + data.memberData.bankSold = data.memberData.bankSold - amount; + data.memberData.save(); + + message.success("economy/withdraw:SUCCESS", { + money: `**${amount}** ${message.getNoun(amount, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + }); + } +} + +module.exports = Withdraw; \ No newline at end of file diff --git a/TO REWRITE/Economy/work.js b/TO REWRITE/Economy/work.js new file mode 100644 index 00000000..a1ed8570 --- /dev/null +++ b/TO REWRITE/Economy/work.js @@ -0,0 +1,114 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Work extends Command { + constructor(client) { + super(client, { + name: "work", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["salary", "daily"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + // if the member is already in the cooldown db + const isInCooldown = data.memberData.cooldowns.work; + if (isInCooldown) { + /*if the timestamp recorded in the database indicating + when the member will be able to execute the order again + is greater than the current date, display an error message */ + if (isInCooldown > Date.now()) return message.error("economy/work:COOLDOWN", { + time: this.client.convertTime(isInCooldown, "to", true) + }); + } + + if (Date.now() > data.memberData.cooldowns.work + (24 * 3600000)) data.memberData.workStreak = 0; + + // Records in the database the time when the member will be able to execute the command again (in 12 hours) + const toWait = Date.now() + 43200000; + data.memberData.cooldowns.work = toWait; + data.memberData.markModified("cooldowns"); + + data.memberData.workStreak = (data.memberData.workStreak || 0) + 1; + await data.memberData.save(); + + const embed = new Discord.MessageEmbed() + .setFooter({ + text: message.translate("economy/work:AWARD"), + iconURL: message.author.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setColor(data.config.embed.color); + + const award = [ + this.client.customEmojis.letters.a, + this.client.customEmojis.letters.w, + this.client.customEmojis.letters.a, + this.client.customEmojis.letters.r, + this.client.customEmojis.letters.d + ]; + let won = 200; + + if (data.memberData.workStreak >= 5) { + won += 200; + embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", { + won: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + })) + .addField(message.translate("economy/work:STREAK"), message.translate("economy/work:STREAK_CONTENT")); + data.memberData.workStreak = 0; + } else { + for (let i = 0; i < award.length; i++) { + if (data.memberData.workStreak > i) { + const letter = Discord.Util.parseEmoji(award[i]).name.split("_")[1]; + award[i] = `:regional_indicator_${letter.toLowerCase()}:`; + } + } + embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", { + won: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + })) + .addField(message.translate("economy/work:STREAK"), award.join("")); + } + + const info = { + user: message.translate("economy/work:SALARY"), + amount: won, + date: Date.now(), + type: "got" + }; + + data.memberData.transactions.push(info); + data.memberData.money = data.memberData.money + won; + data.memberData.save(); + + const messageOptions = { + embeds: [embed] + }; + if (!data.userData.achievements.work.achieved) { + data.userData.achievements.work.progress.now += 1; + if (data.userData.achievements.work.progress.now === data.userData.achievements.work.progress.total) { + messageOptions.files = [{ + name: "unlocked.png", + attachment: "./assets/img/achievements/achievement_unlocked1.png" + }]; + data.userData.achievements.work.achieved = true; + } + data.userData.markModified("achievements.work"); + data.userData.save(); + } + + // Send the embed in the current channel + message.reply(messageOptions); + } +} + +module.exports = Work; \ No newline at end of file diff --git a/commands/Examples/mention.js b/TO REWRITE/Examples/mention.js similarity index 100% rename from commands/Examples/mention.js rename to TO REWRITE/Examples/mention.js diff --git a/commands/Examples/ping.js b/TO REWRITE/Examples/ping.js similarity index 100% rename from commands/Examples/ping.js rename to TO REWRITE/Examples/ping.js diff --git a/commands/Examples/repeat.js b/TO REWRITE/Examples/repeat.js similarity index 100% rename from commands/Examples/repeat.js rename to TO REWRITE/Examples/repeat.js diff --git a/TO REWRITE/Fun/8ball.js b/TO REWRITE/Fun/8ball.js new file mode 100644 index 00000000..e0ab1bc7 --- /dev/null +++ b/TO REWRITE/Fun/8ball.js @@ -0,0 +1,31 @@ +const Command = require("../../base/Command"); + +class Eightball extends Command { + constructor(client) { + super(client, { + name: "8ball", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["8b"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args) { + if (!args[0] || !message.content.endsWith("?")) return message.error("fun/8ball:ERR_QUESTION"); + + const answerN = this.client.functions.randomNum(1, 20); + const answer = message.translate(`fun/8ball:RESPONSE_${answerN}`); + + message.reply({ + content: answer + }); + } +} + +module.exports = Eightball; \ No newline at end of file diff --git a/TO REWRITE/Fun/ascii.js b/TO REWRITE/Fun/ascii.js new file mode 100644 index 00000000..ae70522b --- /dev/null +++ b/TO REWRITE/Fun/ascii.js @@ -0,0 +1,34 @@ +const Command = require("../../base/Command"), + figlet = require("figlet"), + util = require("util"), + figletAsync = util.promisify(figlet); + +class Ascii extends Command { + constructor(client) { + super(client, { + name: "ascii", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args) { + const text = args.join(" "); + if (!text || text.length > 20) return message.error("fun/ascii:TEXT_MISSING"); + + const rendered = await figletAsync(text); + + message.reply({ + content: "```" + rendered + "```" + }); + } +} + +module.exports = Ascii; \ No newline at end of file diff --git a/TO REWRITE/Fun/flip.js b/TO REWRITE/Fun/flip.js new file mode 100644 index 00000000..09944fe1 --- /dev/null +++ b/TO REWRITE/Fun/flip.js @@ -0,0 +1,25 @@ +const Command = require("../../base/Command"); + +class Flip extends Command { + constructor(client) { + super(client, { + name: "flip", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["dice", "coin"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message) { + const isHeads = Math.random() > 0.5; + isHeads ? message.sendT("fun/flip:HEADS") : message.sendT("fun/flip:TAILS"); + } +} + +module.exports = Flip; \ No newline at end of file diff --git a/TO REWRITE/Fun/lmg.js b/TO REWRITE/Fun/lmg.js new file mode 100644 index 00000000..0742216b --- /dev/null +++ b/TO REWRITE/Fun/lmg.js @@ -0,0 +1,30 @@ +const Command = require("../../base/Command"); + +class Lmg extends Command { + constructor(client) { + super(client, { + name: "lmg", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["lmgtfy"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + const question = args.join(" "); + if (!question) return message.error("fun/lmg:MISSING"); + const encodedQuestion = question.replace(/[' '_]/g, "+"); + await message.reply({ + content: `` + }); + message.delete().catch(() => {}); + } +} + +module.exports = Lmg; \ No newline at end of file diff --git a/TO REWRITE/Fun/lovecalc.js b/TO REWRITE/Fun/lovecalc.js new file mode 100644 index 00000000..102f4a9d --- /dev/null +++ b/TO REWRITE/Fun/lovecalc.js @@ -0,0 +1,59 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + md5 = require("md5"); + +class Lovecalc extends Command { + constructor(client) { + super(client, { + name: "lovecalc", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["lc"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const firstMember = message.mentions.members.filter(m => m.id !== message.author.id).first(); + if (!firstMember) return message.error("fun/lovecalc:MISSING"); + const secondMember = message.mentions.members + .filter(m => m.id !== firstMember.id) + .filter(m => m.id !== message.author.id) + .first() || message.member; + if (!secondMember) return message.error("fun/lovecalc:MISSING"); + + const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10)); + const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`); + + const string = hash + .split("") + .filter(e => !isNaN(e)) + .join(""); + const percent = parseInt(string.substr(0, 2), 10); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: `❤️ ${message.translate("fun/lovecalc:DESCRIPTION")}` + }) + .setDescription(message.translate("fun/lovecalc:CONTENT", { + percent, + firstUsername: firstMember.user.username, + secondUsername: secondMember.user.username + })) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Lovecalc; \ No newline at end of file diff --git a/TO REWRITE/Fun/memes.js b/TO REWRITE/Fun/memes.js new file mode 100644 index 00000000..5026f94c --- /dev/null +++ b/TO REWRITE/Fun/memes.js @@ -0,0 +1,78 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + fetch = require("node-fetch"); + +class Memes extends Command { + constructor(client) { + super(client, { + name: "memes", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["mem"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const tag = args[0]; + const subs = ["memes", "dankmemes", "me_irl", "wholesomememes"]; + + if (tag === "list") { + const embed = new Discord.MessageEmbed() + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setTitle(message.translate("fun/memes:EMBED_TITLE")) + .setDescription(subs.join("\n")) + .setTimestamp(); + + message.reply({ + embeds: [embed] + }); + } else if (!tag) { + const m = await message.sendT("fun/memes:SEARCHING_RANDOM"); + + const res = await fetch("https://meme-api.herokuapp.com/gimme/").then(response => response.json()); + const embed = new Discord.MessageEmbed() + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) + .setImage(res.url) + .setTimestamp(); + + m.edit({ + content: null, + embeds: [embed] + }); + } else if (subs.includes(tag)) { + const m = await message.sendT("fun/memes:SEARCHING", { + tag + }); + + const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); + const embed = new Discord.MessageEmbed() + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) + .setImage(res.url) + .setTimestamp(); + + m.edit({ + content: null, + embeds: [embed] + }); + } else return message.error("fun/memes:NOT_FOUND"); + } +} + +module.exports = Memes; \ No newline at end of file diff --git a/TO REWRITE/General/activity.js b/TO REWRITE/General/activity.js new file mode 100644 index 00000000..aa8d852f --- /dev/null +++ b/TO REWRITE/General/activity.js @@ -0,0 +1,263 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Activity extends Command { + constructor(client) { + super(client, { + name: "activity", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["act"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const voice = message.member.voice.channel; + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + + const perms = voice.permissionsFor(this.client.user); + if (!perms.has(Discord.Permissions.FLAGS.CONNECT) || !perms.has(Discord.Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); + + const activities = [ + "betrayal", + `checkers (${message.translate("general/activity:NO_BOOST")})`, + `chess (${message.translate("general/activity:NO_BOOST")})`, + "sketchheads", + `ocho (${message.translate("general/activity:NO_BOOST")})`, + "fishing", + "lettertile", + `poker (${message.translate("general/activity:NO_BOOST")})`, + `spellcast (${message.translate("general/activity:NO_BOOST")})`, + "wordsnack", + "puttparty", + "youtube" + ]; + const activity = args[0]; + + switch (activity) { + case "betrayal": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "betrayal").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Betrayal.io") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Betrayal.io", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "checkers": + if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); + + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "checkers").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Checkers In The Park") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Checkers In The Park", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "chess": + if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); + + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "chess").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Chess In The Park") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Chess In The Park", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "sketchheads": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "sketchheads").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Sketch Heads") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Sketch Heads", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "ocho": + if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); + + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "ocho").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Ocho") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Ocho", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "fishing": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "fishing").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Fishington.io") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Fishington.io", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "lettertile": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "lettertile").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Letter Tile") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Letter Tile", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "poker": + if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); + + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "poker").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Poker Night") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Poker Night", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "spellcast": + if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); + + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "spellcast").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Spell Cast") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Spell Cast", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "wordsnack": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "wordsnack").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Words Snack") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Words Snack", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "puttparty": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "puttparty").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Puttparty") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Puttparty", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + case "youtube": + this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "youtube").then(async invite => { + const embed = new Discord.MessageEmbed() + .setTitle("Youtube Together") + .setColor(data.config.embed.color) + .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Youtube Together", channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + }); + break; + + default: { + const embed = new Discord.MessageEmbed() + .setTitle(message.translate("general/activity:TITLE")) + .setDescription(activities.join("\n")) + .setColor(data.config.embed.color) + .setFooter({ + text: message.translate("general/activity:FOOTER") + }) + .setTimestamp(); + message.reply({ + embeds: [embed] + }); + } + } + } +} + +module.exports = Activity; \ No newline at end of file diff --git a/TO REWRITE/General/avatar.js b/TO REWRITE/General/avatar.js new file mode 100644 index 00000000..f875f72a --- /dev/null +++ b/TO REWRITE/General/avatar.js @@ -0,0 +1,37 @@ +const Command = require("../../base/Command"); + +class Avatar extends Command { + constructor(client) { + super(client, { + name: "avatar", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args) { + let user = await this.client.resolveUser(args[0]); + if (!user) user = message.author; + const avatarURL = user.displayAvatarURL({ + dynamic: true, + size: 512 + }); + + if (args[0] === "link") return message.reply({ content: `<${avatarURL}>` }); + + message.reply({ + files: [{ + attachment: avatarURL + }] + }); + } +} + +module.exports = Avatar; \ No newline at end of file diff --git a/TO REWRITE/General/emoji.js b/TO REWRITE/General/emoji.js new file mode 100644 index 00000000..bfbfd5bf --- /dev/null +++ b/TO REWRITE/General/emoji.js @@ -0,0 +1,46 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class EmojiInfo extends Command { + constructor(client) { + super(client, { + name: "emoji", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["emi"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const rawEmoji = args[0]; + if (!rawEmoji) return message.error("administration/stealemoji:MISSING_EMOJI"); + + const parsedEmoji = Discord.Util.parseEmoji(rawEmoji); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("general/emoji:TITLE", { + emoji: parsedEmoji.name + }) + }) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .addField(message.translate("general/emoji:NAME"), parsedEmoji.name) + .addField(message.translate("general/emoji:ANIMATED"), parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO")) + .addField(message.translate("general/emoji:ID"), parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART")); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = EmojiInfo; \ No newline at end of file diff --git a/TO REWRITE/General/help.js b/TO REWRITE/General/help.js new file mode 100644 index 00000000..882c3d08 --- /dev/null +++ b/TO REWRITE/General/help.js @@ -0,0 +1,117 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Help extends Command { + constructor(client) { + super(client, { + name: "help", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["h", "commands"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + if (args[0]) { + const isCustom = (message.guild && data.guild.customCommands ? data.guild.customCommands.find((c) => c.name === args[0]) : false); + + const cmd = this.client.commands.get(args[0]) || this.client.commands.get(this.client.aliases.get(args[0])); + if (!cmd && isCustom) { + return message.error("general/help:CUSTOM", { + cmd: args[0] + }); + } else if (!cmd) { + return message.error("general/help:NOT_FOUND", { + search: args[0] + }); + } + + const description = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:DESCRIPTION`); + const usage = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:USAGE`, { + prefix: message.guild ? data.guild.prefix : "" + }); + const examples = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:EXAMPLES`, { + prefix: message.guild ? data.guild.prefix : "" + }); + + const groupEmbed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("general/help:CMD_TITLE", { + cmd: cmd.help.name + }) + }) + .addField(message.translate("general/help:FIELD_DESCRIPTION"), description) + .addField(message.translate("general/help:FIELD_USAGE"), usage) + .addField(message.translate("general/help:FIELD_EXAMPLES"), examples) + .addField(message.translate("general/help:FIELD_ALIASES"), cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS")) + .addField(message.translate("general/help:FIELD_PERMISSIONS"), cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION")) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + return message.reply({ + embeds: [groupEmbed] + }); + } + + const categories = []; + const commands = this.client.commands; + + commands.forEach((command) => { + if (!categories.includes(command.help.category)) { + if (command.help.category === "Owner" && message.author.id !== data.config.owner.id) return; + categories.push(command.help.category); + } + }); + + const emojis = this.client.customEmojis; + + const embed = new Discord.MessageEmbed() + .setDescription(message.translate("general/help:INFO", { + prefix: message.guild ? data.guild.prefix : "" + })) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + categories.sort().forEach((cat) => { + const tCommands = commands.filter((cmd) => cmd.help.category === cat); + embed.addField(`${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`, `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}`); + }); + + if (message.guild) { + if (data.guild.customCommands.length > 0) embed.addField(`${emojis.categories.custom} ${message.guild.name} | ${message.translate("general/help:CUSTOM_COMMANDS")} - (${data.guild.customCommands.length})`, data.guild.customCommands.map((cmd) => `\`${cmd.name}\``).join(", ")); + } + + embed.addField("\u200B", message.translate("misc:STATS_FOOTER", { + dashboardLink: this.client.config.dashboard.baseURL, + docsLink: `${this.client.config.dashboard.baseURL}/docs/`, + inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }), + donateLink: "https://qiwi.com/n/JONNYBRO/", + owner: data.config.owner.id + })); + embed.setAuthor({ + name: message.translate("general/help:TITLE", { + name: this.client.user.username + }), + iconURL: this.client.user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }); + + return message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Help; \ No newline at end of file diff --git a/TO REWRITE/General/invite.js b/TO REWRITE/General/invite.js new file mode 100644 index 00000000..e7e08a95 --- /dev/null +++ b/TO REWRITE/General/invite.js @@ -0,0 +1,55 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Invite extends Command { + constructor(client) { + super(client, { + name: "invite", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["i"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const inviteLink = this.client.generateInvite({ + scopes: ["bot", "applications.commands"], + permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] + }); + const donateLink = "https://qiwi.com/n/JONNYBRO/"; + + if (args[0] && args[0] === "copy") return message.reply({ + content: inviteLink + }); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("general/invite:LINKS") + }) + .setDescription(message.translate("general/invite:TIP", { + prefix: data.guild.prefix || "" + })) + .addField(message.translate("general/invite:ADD"), message.translate("general/invite:CLICK", { + link: inviteLink + })) + .addField(message.translate("general/invite:SUPPORT"), message.translate("general/invite:CLICK", { + link: donateLink + }) + `\n*для других способов пишите в ЛС <@${data.config.owner.id}> (указывайте ваш Discord тэг чтобы я мог выдать вам ачивку)*`) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Invite; \ No newline at end of file diff --git a/TO REWRITE/General/invites.js b/TO REWRITE/General/invites.js new file mode 100644 index 00000000..64621010 --- /dev/null +++ b/TO REWRITE/General/invites.js @@ -0,0 +1,72 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Invites extends Command { + constructor(client) { + super(client, { + name: "invites", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["invs"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_GUILD"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let member = await this.client.resolveMember(args[0], message.guild); + if (!member) member = message.member; + + const invites = await message.guild.invites.fetch().catch(() => {}); + if (!invites) return message.error("misc:ERR_OCCURRED"); + + const memberInvites = invites.filter((i) => i.inviter && i.inviter.id === member.user.id); + + if (memberInvites.size <= 0) { + if (member === message.member) { + return message.error("general/invites:NOBODY_AUTHOR"); + } else { + return message.error("general/invites:NOBODY_MEMBER", { + member: member.user.tag + }); + } + } + + const content = memberInvites.map((i) => { + return message.translate("general/invites:CODE", { + uses: i.uses, + code: i.code, + channel: i.channel.toString() + }); + }).join("\n"); + let index = 0; + memberInvites.forEach((invite) => index += invite.uses); + + const embed = new Discord.MessageEmbed() + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setAuthor({ + name: message.translate("general/invites:TRACKER") + }) + .setDescription(message.translate("general/invites:TITLE", { + member: member.user.tag, + guild: message.guild.name + })) + .addField(message.translate("general/invites:FIELD_INVITED"), message.translate("general/invites:FIELD_MEMBERS", { + total: index + })) + .addField(message.translate("general/invites:FIELD_CODES"), content); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Invites; \ No newline at end of file diff --git a/TO REWRITE/General/minecraft.js b/TO REWRITE/General/minecraft.js new file mode 100644 index 00000000..22679cf7 --- /dev/null +++ b/TO REWRITE/General/minecraft.js @@ -0,0 +1,85 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + gamedig = require("gamedig"); + +class Minecraft extends Command { + constructor(client) { + super(client, { + name: "minecraft", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["mc"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const ip = args[0]; + if (!ip) return message.error("general/minecraft:MISSING_IP"); + + const favicon = `https://eu.mc-api.net/v3/server/favicon/${ip}`; + let options = { + type: "minecraft", + host: ip + }; + + if (ip.split(":").length > 1) { + const ipp = ip.split(":"); + options = { + type: "minecraft", + host: ipp[0], + port: ipp[1] + }; + } + + const m = await message.sendT("misc:PLEASE_WAIT", null, { + prefixEmoji: "loading" + }); + + let json = null; + + await gamedig.query(options).then((res) => { + json = res; + }).catch((err) => { + console.error(err); + }); + + if (!json) { + options.type = "minecraftpe"; + await gamedig.query(options).then((res) => { + json = res; + }).catch((err) => { + console.error(err); + }); + } + + if (!json) return m.error("general/minecraft:FAILED", null, { edit: true }); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: json.name + }) + .addField(message.translate("general/minecraft:FIELD_STATUS"), message.translate("general/minecraft:ONLINE")) + .addField(message.translate("general/minecraft:FIELD_CONNECTED"), `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}`) + .addField(message.translate("general/minecraft:FIELD_IP"), json.connect, true) + .addField(message.translate("general/minecraft:FIELD_VERSION"), json.raw.vanilla.raw.version.name, true) + .addField(message.translate("general/minecraft:FIELD_PING"), json.raw.vanilla.ping.toString()) + .setColor(data.config.embed.color) + .setThumbnail(favicon) + .setFooter({ + text: data.config.embed.footer + }); + + m.edit({ + content: null, + embeds: [embed] + }); + } +} + +module.exports = Minecraft; \ No newline at end of file diff --git a/TO REWRITE/General/permissions.js b/TO REWRITE/General/permissions.js new file mode 100644 index 00000000..de3c1ef0 --- /dev/null +++ b/TO REWRITE/General/permissions.js @@ -0,0 +1,50 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +const permissions = Object.keys(Discord.Permissions.FLAGS); + +class Permissions extends Command { + constructor(client) { + super(client, { + name: "permissions", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["perms"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message) { + const member = message.mentions.members.first() || message.member; + const mPermissions = message.channel.permissionsFor(member); + const total = { + denied: 0, + allowed: 0 + }; + + let text = `**${message.translate("general/permissions:TITLE", { user: member.user.username, channel: message.channel.name })}**\n`; + permissions.forEach((perm) => { + if (perm === "REQUEST_TO_SPEAK") return; + + if (!mPermissions.has(perm)) { + text += `${message.translate(`misc:PERMISSIONS:${perm}`)} ❌\n`; + total.denied++; + } else { + text += `${message.translate(`misc:PERMISSIONS:${perm}`)} ✅\n`; + total.allowed++; + } + }); + text += `\n${total.allowed} ✅ | ${total.denied} ❌`; + + message.reply({ + content: text + }); + } +} + +module.exports = Permissions; \ No newline at end of file diff --git a/TO REWRITE/General/quote.js b/TO REWRITE/General/quote.js new file mode 100644 index 00000000..f464a03f --- /dev/null +++ b/TO REWRITE/General/quote.js @@ -0,0 +1,88 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Quote extends Command { + constructor(client) { + super(client, { + name: "quote", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["qu"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + function embed(m) { + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: m.author.tag, + iconURL: m.author.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setDescription(m.content) + .setColor(m.member ? m.member.roles.highest ? m.member.roles.highest.color : data.config.embed.color : data.config.embed.color) + .setFooter({ + text: m.guild.name + " | #" + m.channel.name + }) + .setTimestamp(m.createdTimestamp); + if (m.attachments.size > 0) embed.setImage(m.attachments.first().url); + return embed; + } + + const msgID = args[0]; + if (isNaN(msgID)) { + message.error("general/quote:MISSING_ID").then(() => { + if (message.deletable) message.delete(); + }); + return; + } + + let channel = args[1]; + if (args[1]) { + channel = this.client.channels.cache.get(args[1]); + if (!channel) { + message.error("general/quote:NO_MESSAGE_ID").then(() => { + if (message.deletable) message.delete(); + }); + return; + } + } + + if (!channel) { + message.channel.messages.fetch(msgID).catch(() => { + message.error("general/quote:NO_MESSAGE_ID").then(() => { + if (message.deletable) message.delete(); + }); + return; + }).then((msg) => { + if (message.deletable) message.delete(); + message.reply({ + embeds: [embed(msg)] + }); + }); + } else { + channel.messages.fetch(msgID).then((msg) => { + if (message.deletable) message.delete(); + message.reply({ + embeds: [embed(msg)] + }); + }).catch(() => { + message.error("general/quote:NO_MESSAGE_ID").then(() => { + if (message.deletable) message.delete(); + }); + return; + }); + } + } +} + +module.exports = Quote; \ No newline at end of file diff --git a/TO REWRITE/General/remindme.js b/TO REWRITE/General/remindme.js new file mode 100644 index 00000000..eb5861b6 --- /dev/null +++ b/TO REWRITE/General/remindme.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"), + ms = require("ms"); + +class Remindme extends Command { + constructor(client) { + super(client, { + name: "remindme", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["reminder", "remind", "rem"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const time = args[0]; + if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME"); + + const msg = args.slice(1).join(" "); + if (!msg) return message.error("general/remindme:MISSING_MESSAGE"); + + const rData = { + message: msg, + createdAt: Date.now(), + sendAt: Date.now() + ms(time) + }; + + if (!data.userData.reminds) data.userData.reminds = []; + + + data.userData.reminds.push(rData); + data.userData.markModified("reminds"); + data.userData.save(); + this.client.databaseCache.usersReminds.set(message.author.id, data.userData); + + message.success("general/remindme:SAVED"); + } +} + +module.exports = Remindme; \ No newline at end of file diff --git a/TO REWRITE/General/report.js b/TO REWRITE/General/report.js new file mode 100644 index 00000000..b63c239e --- /dev/null +++ b/TO REWRITE/General/report.js @@ -0,0 +1,69 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Report extends Command { + constructor(client) { + super(client, { + name: "report", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["repo"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + if (message.author.id === "285109105717280768") return message.reply({ content: "Пошёл нахуй фахон" }); + + const repChannel = message.guild.channels.cache.get(data.guild.plugins.reports); + if (!repChannel) return message.error("general/report:MISSING_CHANNEL"); + + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("general/report:MISSING_USER"); + if (member.id === message.author.id) return message.error("general/report:INVALID_USER"); + + const rep = args.slice(1).join(" "); + if (!rep) return message.error("general/report:MISSING_REASON"); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("general/report:TITLE", { + user: member.user.tag + }), + iconURL: message.author.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .addField(message.translate("common:AUTHOR"), message.author.tag, true) + .addField(message.translate("common:DATE"), this.client.printDate(new Date(Date.now())), true) + .addField(message.translate("common:REASON"), rep, true) + .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + const success = Discord.Util.parseEmoji(this.client.customEmojis.success).id; + const error = Discord.Util.parseEmoji(this.client.customEmojis.error).id; + + repChannel.send({ + embeds: [embed] + }).then(async (m) => { + await m.react(success); + await m.react(error); + }); + + message.success("general/report:SUCCESS", { + channel: repChannel.toString() + }); + } +} + +module.exports = Report; \ No newline at end of file diff --git a/TO REWRITE/General/serverinfo.js b/TO REWRITE/General/serverinfo.js new file mode 100644 index 00000000..4124ee3e --- /dev/null +++ b/TO REWRITE/General/serverinfo.js @@ -0,0 +1,71 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Serverinfo extends Command { + constructor(client) { + super(client, { + name: "serverinfo", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["si"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let guild = message.guild; + + if (args[0]) { + let found = this.client.guilds.cache.get(args[0]); + if (!found) { + found = this.client.guilds.cache.find(g => g.name.includes(args.join(" ")) || g.id === args[0]); + if (found) guild = found; + } + } + + await guild.members.fetch(); + const owner = await guild.fetchOwner(); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: guild.name, + iconURL: guild.iconURL({ + dynamic: true + }) + }) + .setThumbnail(guild.iconURL({ + dynamic: true + })) + .addField(this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"), `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})`) + .addField(this.client.customEmojis.title + message.translate("common:NAME"), guild.name, true) + .addField(this.client.customEmojis.calendar + message.translate("common:CREATION"), this.client.printDate(guild.createdAt), true) + .addField(this.client.customEmojis.users + message.translate("common:MEMBERS"), + `${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` + + "\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`, true + ) + .addField(this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"), guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"), true) + .addField(this.client.customEmojis.id + message.translate("common:ID"), guild.id, true) + .addField(this.client.customEmojis.crown + message.translate("common:OWNER"), owner.toString(), true) + .addField(this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"), guild.premiumSubscriptionCount.toString() || "0", true) + .addField(this.client.customEmojis.channels + message.translate("common:CHANNELS"), + `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` + + "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` + + "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`, true + ) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Serverinfo; \ No newline at end of file diff --git a/TO REWRITE/General/setafk.js b/TO REWRITE/General/setafk.js new file mode 100644 index 00000000..2d54f2b4 --- /dev/null +++ b/TO REWRITE/General/setafk.js @@ -0,0 +1,49 @@ +const Command = require("../../base/Command"); + +class Setafk extends Command { + constructor(client) { + super(client, { + name: "setafk", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["afk"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const reason = args.join(" "); + if (!reason || reason.length > 250) return message.error("general/setafk:MISSING_REASON"); + + if (reason === "delete") { + if (data.userData.afk) { + data.userData.afk = null; + data.userData.save(); + + return message.sendT("general/setafk:DELETED", { + username: message.author.username + }); + } + } else { + data.userData.afk = reason; + data.userData.save(); + + const m = await message.success("general/setafk:SUCCESS", { + reason, + prefix: message.guild ? data.guild.prefix : "" + }); + + setTimeout(() => { + if (m.deletable) m.delete(); + if (message.deletable) message.delete(); + }, 10 * 1000); + } + } +} + +module.exports = Setafk; \ No newline at end of file diff --git a/TO REWRITE/General/shorturl.js b/TO REWRITE/General/shorturl.js new file mode 100644 index 00000000..d353f77a --- /dev/null +++ b/TO REWRITE/General/shorturl.js @@ -0,0 +1,42 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + fetch = require("node-fetch"); + +class ShortURL extends Command { + constructor(client) { + super(client, { + name: "shorturl", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["minimize"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const url = args[0]; + if (!url) return message.error("general/shorturl:MISSING_URL"); + + const res = await fetch(`https://is.gd/create.php?format=simple&url=${encodeURI(url)}`); + const body = await res.text(); + + if (body === "Error: Please enter a valid URL to shorten") return message.error("general/shorturl:MISSING_URL"); + + const embed = new Discord.MessageEmbed() + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setDescription(body); + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = ShortURL; \ No newline at end of file diff --git a/TO REWRITE/General/staff.js b/TO REWRITE/General/staff.js new file mode 100644 index 00000000..e05204ae --- /dev/null +++ b/TO REWRITE/General/staff.js @@ -0,0 +1,42 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Staff extends Command { + constructor(client) { + super(client, { + name: "staff", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["staf"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + await message.guild.members.fetch(); + const administrators = message.guild.members.cache.filter((m) => m.permissions.has(Discord.Permissions.FLAGS.ADMINISTRATOR) && !m.user.bot); + const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(Discord.Permissions.FLAGS.MANAGE_MESSAGES) && !m.user.bot); + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("general/staff:TITLE", { + guild: message.guild.name + }) + }) + .addField(message.translate("general/staff:ADMINS"), (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS"))) + .addField(message.translate("general/staff:MODS"), (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS"))) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Staff; \ No newline at end of file diff --git a/TO REWRITE/General/stats.js b/TO REWRITE/General/stats.js new file mode 100644 index 00000000..4164aa37 --- /dev/null +++ b/TO REWRITE/General/stats.js @@ -0,0 +1,63 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Stats extends Command { + constructor(client) { + super(client, { + name: "stats", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["stat"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const hiddenGuild = await this.client.guilds.fetch("568120814776614924"); + const users = this.client.users.cache.size - hiddenGuild.memberCount; + const servers = this.client.guilds.cache.size - 1; + + const statsEmbed = new Discord.MessageEmbed() + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setAuthor({ + name: message.translate("common:STATS") + }) + .setDescription(message.translate("general/stats:MADE")) + .addField(this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"), message.translate("general/stats:COUNTS_CONTENT", { + servers: servers, + users: users + }), true) + .addField(this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"), `\`Discord.js : v${Discord.version}\`\n\`Nodejs : v${process.versions.node}\``, true) + .addField(this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"), `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, true) + .addField(this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"), message.translate("general/stats:ONLINE_CONTENT", { + time: this.client.convertTime(Date.now() + this.client.uptime, "from", true) + })) + .addField(this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"), message.translate("general/stats:MUSIC_CONTENT", { + count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}` + })) + .addField(message.translate("general/stats:CREDITS_TITLE"), message.translate("general/stats:CREDITS_CONTENT", { + donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"), + translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua:"].join("\n") + })) + .addField(this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"), message.translate("misc:STATS_FOOTER", { + dashboardLink: this.client.config.dashboard.baseURL, + docsLink: `${this.client.config.dashboard.baseURL}/docs/`, + inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }), + donateLink: "https://qiwi.com/n/JONNYBRO/", + owner: data.config.owner.id + })); + message.reply({ + embeds: [statsEmbed] + }); + } +} + +module.exports = Stats; \ No newline at end of file diff --git a/TO REWRITE/General/suggest.js b/TO REWRITE/General/suggest.js new file mode 100644 index 00000000..e4fd01f6 --- /dev/null +++ b/TO REWRITE/General/suggest.js @@ -0,0 +1,64 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Suggest extends Command { + constructor(client) { + super(client, { + name: "suggest", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["sugg"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + if (message.author.id === "285109105717280768") return message.reply({ content: "Пошёл нахуй фахон" }); + + const suggChannel = message.guild.channels.cache.get(data.guild.plugins.suggestions); + if (!suggChannel) return message.error("general/suggest:MISSING_CHANNEL"); + + const sugg = args.join(" "); + if (!sugg) return message.error("general/suggest:MISSING_CONTENT"); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("general/suggest:TITLE", { + user: message.author.username + }), + iconURL: message.author.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .addField(message.translate("common:AUTHOR"), `\`${message.author.username}#${message.author.discriminator}\``, true) + .addField(message.translate("common:DATE"), this.client.printDate(new Date(Date.now())), true) + .addField(message.translate("common:CONTENT"), sugg) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + const success = Discord.Util.parseEmoji(this.client.customEmojis.cool).id; + const error = Discord.Util.parseEmoji(this.client.customEmojis.notcool).id; + + suggChannel.send({ + embeds: [embed] + }).then(async (m) => { + await m.react(success); + await m.react(error); + }); + + message.success("general/suggest:SUCCESS", { + channel: suggChannel.toString() + }); + } +} + +module.exports = Suggest; \ No newline at end of file diff --git a/TO REWRITE/General/translate.js b/TO REWRITE/General/translate.js new file mode 100644 index 00000000..b5bb2219 --- /dev/null +++ b/TO REWRITE/General/translate.js @@ -0,0 +1,72 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + translate = require("@k3rn31p4nic/google-translate-api"); + +const langs = ["afrikaans", "albanian", "amharic", "arabic", "armenian", "azerbaijani", "bangla", "basque", "belarusian", "bengali", "bosnian", "bulgarian", "burmese", "catalan", "cebuano", "chichewa", "corsican", "croatian", "czech", "danish", "dutch", "english", "esperanto", "estonian", "filipino", "finnish", "french", "frisian", "galician", "georgian", "german", "greek", "gujarati", "haitian creole", "hausa", "hawaiian", "hebrew", "hindi", "hmong", "hungarian", "icelandic", "igbo", "indonesian", "irish", "italian", "japanese", "javanese", "kannada", "kazakh", "khmer", "korean", "kurdish (kurmanji)", "kyrgyz", "lao", "latin", "latvian", "lithuanian", "luxembourgish", "macedonian", "malagasy", "malay", "malayalam", "maltese", "maori", "marathi", "mongolian", "myanmar (burmese)", "nepali", "norwegian", "nyanja", "pashto", "persian", "polish", "portugese", "punjabi", "romanian", "russian", "samoan", "scottish gaelic", "serbian", "sesotho", "shona", "sindhi", "sinhala", "slovak", "slovenian", "somali", "spanish", "sundanese", "swahili", "swedish", "tajik", "tamil", "telugu", "thai", "turkish", "ukrainian", "urdu", "uzbek", "vietnamese", "welsh", "xhosa", "yiddish", "yoruba", "zulu"]; + +class Translate extends Command { + constructor(client) { + super(client, { + name: "translate", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["tran"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args, data) { + if (args[0] === "langs-list") { + const langsList = "```css\n" + (langs.map((lang, i) => `${i + 1} - ${lang}`).join("\n")) + "```"; + message.author.send(langsList).then(() => { + message.success("general/translate:LIST_SENT"); + }).catch(() => { + message.error("misc:CANNOT_DM"); + }); + return; + } + + const pWait = await message.sendT("misc:PLEASE_WAIT", null, { + prefixEmoji: "loading" + }); + + if (!args[0]) return pWait.error("general/translate:MISSING_LANGUAGE", { prefix: data.guild.prefix }, { edit: true }); + if (!args[1]) return pWait.error("general/translate:MISSING_CONTENT", null, { edit: true }); + + // Gets different args + const language = args[0].toLowerCase(); + const toTranslate = args.slice(1).join(" "); + + if (!langs.includes(language)) return pWait.error("general/translate:INVALID_LANGUAGE", { prefix: data.guild.prefix, search: language }, { edit: true }); + + const translated = await translate(toTranslate, { to: language }); + + const resEmbed = new Discord.MessageEmbed() + .setAuthor({ + name: "Переводчик", + iconURL: this.client.user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .addField(translated.from.language.iso, "```" + toTranslate + "```") + .addField(language, "```" + translated.text + "```") + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + return pWait.edit({ + content: null, + embeds: [resEmbed] + }); + } +} + +module.exports = Translate; \ No newline at end of file diff --git a/TO REWRITE/General/userinfo.js b/TO REWRITE/General/userinfo.js new file mode 100644 index 00000000..32d57873 --- /dev/null +++ b/TO REWRITE/General/userinfo.js @@ -0,0 +1,94 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Userinfo extends Command { + constructor(client) { + super(client, { + name: "userinfo", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["ui"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + let displayPresence = true; + + const isID = !isNaN(args[0]); + + let user; + if (!args[0]) user = message.author; + if (message.mentions.users.first()) user = message.mentions.users.first(); + + if (isID && !user) { + user = this.client.users.cache.get(args[0]); + if (!user) { + user = await this.client.users.fetch(args[0], true).catch(() => {}); + displayPresence = false; + } + } + + if (!user) return message.error("general/userinfo:INVALID_USER"); + + let member = null; + if (message.guild) member = await message.guild.members.fetch(user).catch(() => {}); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: `${user.tag} (${user.id})`, + iconURL: user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setThumbnail(user.displayAvatarURL({ + dynamic: true + })) + .addField(":man: " + message.translate("common:USERNAME"), user.username, true) + .addField(this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"), user.discriminator, true) + .addField(this.client.customEmojis.bot + " " + message.translate("common:ROBOT"), (user.bot ? message.translate("common:YES") : message.translate("common:NO")), true) + .addField(this.client.customEmojis.calendar + " " + message.translate("common:CREATION"), this.client.printDate(user.createdAt), true) + .addField(this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + })) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + if (displayPresence) { + if (member.presence.activities[0].name === "Custom Status") { + embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")), true); + embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true); + } else { + embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")), true); + embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true); + } + } + + if (member) { + // embed.addField(this.client.customEmojis.up + " " + message.translate("general/userinfo:ROLE"), (member.roles.highest ? member.roles.highest : message.translate("general/userinfo:NO_ROLE")), true) + embed.addField(this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"), this.client.printDate(member.joinedAt), true); + embed.addField(this.client.customEmojis.color + " " + message.translate("common:COLOR"), member.displayHexColor, true); + embed.addField(this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"), (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")), true); + embed.addField(this.client.customEmojis.roles + " " + message.translate("common:ROLES"), (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", { + count: member.roles.cache.size - 10 + }) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", "))); + } + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Userinfo; \ No newline at end of file diff --git a/TO REWRITE/General/whois.js b/TO REWRITE/General/whois.js new file mode 100644 index 00000000..93c741c4 --- /dev/null +++ b/TO REWRITE/General/whois.js @@ -0,0 +1,73 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + fetch = require("node-fetch"); + +class Whois extends Command { + constructor(client) { + super(client, { + name: "whois", + dirname: __dirname, + enabled: true, + guildOnly: false, + aliases: ["ip"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + if (!args[0]) return message.error("general/whois:NO_IP"); + + const whois = await fetch(`http://ip-api.com/json/${args[0]}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json()); + + if (whois.status === "fail") { + const embed = new Discord.MessageEmbed() + .setDescription(whois.message) + .setTitle(message.translate("general/whois:ERROR", { + ip: args[0] + })) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setTimestamp(); + return message.reply({ + embeds: [embed] + }); + } + + const embed = new Discord.MessageEmbed() + .setTitle(message.translate("general/whois:INFO_ABOUT", { + ip: args[0] + })) + .setFooter({ + text: data.config.embed.footer + }) + .setColor(data.config.embed.color) + .addFields( + { name: "IP", value: whois.query, inline: true }, + { name: message.translate("general/whois:COUNTRY"), value: `${whois.country || "Неизвестно"} (${whois.countryCode || "Неизвестно"})`, inline: true }, + { name: message.translate("general/whois:REGION"), value: `${whois.regionName || "Неизвестно"} (${whois.region || "Неизвестно"})`, inline: true }, + { name: message.translate("general/whois:CITY"), value: `${whois.city || "Неизвестно"}`, inline: true }, + { name: message.translate("general/whois:ZIP"), value: `${whois.zip || "Неизвестно"}`, inline: true }, + { name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || "Неизвестно"}`, inline: true }, + { name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || "Неизвестно"} (${whois.continentCode || "Неизвестно"})`, inline: true }, + { name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || "Неизвестно"}`, inline: true }, + { name: message.translate("general/whois:ISP"), value: `${whois.isp || "Неизвестно"}`, inline: true } + ) + .setTimestamp(); + + if (whois.proxy == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:PROXY") }); + else if (whois.mobile == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:MOBILE") }); + else if (whois.hosting == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:HOSTING") }); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Whois; \ No newline at end of file diff --git a/TO REWRITE/Moderation/announcement.js b/TO REWRITE/Moderation/announcement.js new file mode 100644 index 00000000..e6a604bc --- /dev/null +++ b/TO REWRITE/Moderation/announcement.js @@ -0,0 +1,99 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Announcement extends Command { + constructor(client) { + super(client, { + name: "announcement", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["ann"], + memberPermissions: ["MENTION_EVERYONE"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const text = args.join(" "); + if (!text) return message.error("moderation/announcement:MISSING_TEXT"); + if (text.length > 1030) return message.error("moderation/announcement:TOO_LONG"); + + let mention = null; + const msg = await message.sendT("moderation/announcement:MENTION_PROMPT"); + + const filter = m => m.author.id === message.author.id; + const collector = new Discord.MessageCollector(message.channel, { + filter, + time: 240000 + }); + + collector.on("collect", async (tmsg) => { + if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { + tmsg.delete(); + msg.delete(); + collector.stop(true); + + if (message.deletable) message.delete(); + } + + if (tmsg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { + tmsg.delete(); + msg.delete(); + const tmsg1 = await message.channel.send(message.translate("moderation/announcement:MENTION_TYPE_PROMPT")); + + const filter = m => m.author.id === message.author.id; + const c = new Discord.MessageCollector(message.channel, { + filter, + time: 60000 + }); + c.on("collect", (m) => { + if (m.content.toLowerCase() === "here") { + mention = "@here"; + tmsg1.delete(); + m.delete(); + collector.stop(true); + c.stop(true); + } else if (m.content.toLowerCase() === "everyone") { + mention = "@everyone"; + tmsg1.delete(); + m.delete(); + collector.stop(true); + c.stop(true); + } + }); + + c.on("end", (collected, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + + if (message.deletable) message.delete(); + } + }); + + collector.on("end", (collected, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("moderation/announcement:TITLE") + }) + .setColor(data.config.embed.color) + .setFooter({ + text: message.author.tag + }) + .setTimestamp() + .setDescription(text); + + message.channel.send({ + content: mention, + embeds: [embed] + }); + }); + } +} + +module.exports = Announcement; \ No newline at end of file diff --git a/TO REWRITE/Moderation/ban.js b/TO REWRITE/Moderation/ban.js new file mode 100644 index 00000000..16090e9c --- /dev/null +++ b/TO REWRITE/Moderation/ban.js @@ -0,0 +1,112 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Ban extends Command { + constructor(client) { + super(client, { + name: "ban", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["b"], + memberPermissions: ["BAN_MEMBERS"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const user = await this.client.resolveUser(args[0]); + if (!user) return message.error("moderation/ban:MISSING_MEMBER"); + + const memberData = message.guild.members.cache.get(user.id) ? await this.client.findOrCreateMember({ + id: user.id, + guildID: message.guild.id + }) : null; + + if (user.id === message.author.id) return message.error("moderation/ban:YOURSELF"); + + // If the user is already banned + const banned = await message.guild.bans.fetch(); + if (banned.some((m) => m.user.id === user.id)) return message.error("moderation/ban:ALREADY_BANNED", { + username: user.tag + }); + + // Gets the ban reason + let reason = args.slice(1).join(" "); + if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); + + const member = await message.guild.members.fetch(user.id).catch(() => {}); + if (member) { + const memberPosition = member.roles.highest.position; + const moderationPosition = message.member.roles.highest.position; + if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); + if (!member.bannable) return message.error("moderation/ban:MISSING_PERM"); + } + + await user.send(message.translate("moderation/ban:BANNED_DM", { + username: user.tag, + server: message.guild.name, + moderator: message.author.tag, + reason + })).catch(() => {}); + + // Ban the user + message.guild.members.ban(user, { + reason + }).then(() => { + // Send a success message in the current channel + message.reply({ + content: message.translate("moderation/ban:BANNED", { + username: user.tag, + server: message.guild.name, + moderator: message.author.tag, + reason + }) + }); + + const caseInfo = { + channel: message.channel.id, + moderator: message.author.id, + date: Date.now(), + type: "ban", + case: data.guild.casesCount, + reason + }; + + if (memberData) { + memberData.sanctions.push(caseInfo); + memberData.save(); + } + + data.guild.casesCount++; + data.guild.save(); + + if (data.guild.plugins.modlogs) { + const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); + if (!channel) return; + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("moderation/ban:CASE", { + count: data.guild.casesCount + }) + }) + .addField(message.translate("common:USER"), `\`${user.tag}\` (${user.toString()})`, true) + .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) + .addField(message.translate("common:REASON"), reason, true) + .setColor("#e02316"); + channel.send({ + embeds: [embed] + }); + } + + }).catch((err) => { + console.log(err); + return message.error("moderation/ban:MISSING_PERM"); + }); + } +} + +module.exports = Ban; \ No newline at end of file diff --git a/TO REWRITE/Moderation/clear.js b/TO REWRITE/Moderation/clear.js new file mode 100644 index 00000000..e4b1c27d --- /dev/null +++ b/TO REWRITE/Moderation/clear.js @@ -0,0 +1,80 @@ +const Command = require("../../base/Command"); + +class Clear extends Command { + constructor(client) { + super(client, { + name: "clear", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["cl", "purge"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_MESSAGES"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + if (args[0] === "all") { + message.channel.send(message.translate("moderation/clear:ALL_CONFIRM")); + + const filter = m => m.author.id === message.author.id && m.content === "confirm"; + const collector = message.channel.createMessageCollector({ + filter, + time: 120000 // 2 minutes + }); + + collector.on("collect", async message => { + const position = message.channel.position; + const newChannel = await message.channel.clone(); + await message.channel.delete(); + newChannel.setPosition(position); + return newChannel.send({ + content: message.translate("moderation/clear:CHANNEL_CLEARED") + }); + }); + + collector.on("end", (_, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + } else { + const amount = args[0]; + if (!amount || isNaN(amount) || parseInt(amount) < 1) return message.error("moderation/clear:MISSING_AMOUNT"); + + await message.delete(); + + const user = message.mentions.users.first(); + + let messages = await message.channel.messages.fetch({ + limit: amount + }); + if (user) messages = messages.filter((m) => m.author.id === user.id); + if (messages.length > amount) messages.length = parseInt(amount, 10); + + messages = messages.filter((m) => !m.pinned); + + message.channel.bulkDelete(messages, true); + + let toDelete = null; + + if (user) { + toDelete = await message.channel.send(message.translate("moderation/clear:CLEARED_MEMBER", { + amount: `${amount} ${message.getNoun(amount, message.translate("misc:NOUNS:MESSAGES:1"), message.translate("misc:NOUNS:MESSAGES:2"), message.translate("misc:NOUNS:MESSAGES:5"))}`, + username: user.tag + })); + } else { + toDelete = await message.channel.send(message.translate("moderation/clear:CLEARED", { + amount: `${amount} ${message.getNoun(amount, message.translate("misc:NOUNS:MESSAGES:1"), message.translate("misc:NOUNS:MESSAGES:2"), message.translate("misc:NOUNS:MESSAGES:5"))}` + })); + } + + setTimeout(function () { + toDelete.delete(); + }, 2000); + } + } +} + +module.exports = Clear; \ No newline at end of file diff --git a/TO REWRITE/Moderation/clearwarns.js b/TO REWRITE/Moderation/clearwarns.js new file mode 100644 index 00000000..5303012f --- /dev/null +++ b/TO REWRITE/Moderation/clearwarns.js @@ -0,0 +1,35 @@ +const Command = require("../../base/Command"); + +class Clearwarns extends Command { + constructor(client) { + super(client, { + name: "clearwarns", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["clearw", "clw"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("moderation/clearwarns:MISSING_MEMBER"); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + memberData.sanctions = []; + memberData.save(); + message.success("moderation/clearwarns:SUCCESS", { + username: member.user.tag + }); + } +} + +module.exports = Clearwarns; \ No newline at end of file diff --git a/TO REWRITE/Moderation/giveaway.js b/TO REWRITE/Moderation/giveaway.js new file mode 100644 index 00000000..e90878f7 --- /dev/null +++ b/TO REWRITE/Moderation/giveaway.js @@ -0,0 +1,127 @@ +const Command = require("../../base/Command"), + ms = require("ms"); + +class Giveaway extends Command { + constructor(client) { + super(client, { + name: "giveaway", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["gaway"], + memberPermissions: ["MENTION_EVERYONE"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + const status = args[0]; + if (!status) return message.error("moderation/giveaway:MISSING_STATUS"); + + if (status === "create") { + const currentGiveaways = this.client.giveawaysManager.giveaways.filter((g) => g.guildId === message.guild.id && !g.ended).length; + if (currentGiveaways > 3) return message.error("moderation/giveaway:MAX_COUNT"); + + const time = args[1]; + if (!time) return message.error("moderation/giveaway:INVALID_CREATE", { prefix: data.guild.prefix }); + if (isNaN(ms(time))) return message.error("misc:INVALID_TIME"); + if (ms(time) > ms("15d")) return message.error("moderation/giveaway:MAX_DURATION"); + + const winnersCount = args[2]; + if (!winnersCount) return message.error("moderation/giveaway:INVALID_CREATE", { prefix: data.guild.prefix }); + if (isNaN(winnersCount) || winnersCount > 10 || winnersCount < 1) return message.error("misc:INVALID_NUMBER_RANGE", { min: 1, max: 10 }); + + const drop = (args[3] === "true"); + let prize = args.slice(3).join(" "); + + if (drop) prize = args.slice(4).join(" "); + else prize = args.slice(3).join(" "); + + if (!prize) return message.error("moderation/giveaway:INVALID_CREATE", { prefix: data.guild.prefix }); + + this.client.giveawaysManager.start(message.channel, { + duration: ms(time), + winnerCount: parseInt(winnersCount, 10), + prize: prize, + hostedBy: message.author, + isDrop: drop, + messages: { + giveaway: message.translate("moderation/giveaway:TITLE"), + giveawayEnded: message.translate("moderation/giveaway:ENDED"), + timeRemaining: message.translate("moderation/giveaway:TIME_REMAINING"), + inviteToParticipate: message.translate("moderation/giveaway:INVITE_PARTICIPATE"), + winMessage: message.translate("moderation/giveaway:WIN_MESSAGE"), + drawing: message.translate("moderation/giveaway:DRAWING"), + dropMessage: message.translate("moderation/giveaway:DROP"), + embedFooter: message.translate("moderation/giveaway:FOOTER"), + noWinner: message.translate("moderation/giveaway:NO_WINNER"), + winners: message.translate("moderation/giveaway:WINNERS"), + endedAt: message.translate("moderation/giveaway:END_AT"), + hostedBy: message.translate("moderation/giveaway:HOSTEDBY"), + units: { + seconds: message.translate("time:SECONDS", { + amount: "" + }).trim(), + minutes: message.translate("time:MINUTES", { + amount: "" + }).trim(), + hours: message.translate("time:HOURS", { + amount: "" + }).trim(), + days: message.translate("time:DAYS", { + amount: "" + }).trim() + } + } + }).then(() => { + message.success("moderation/giveaway:GIVEAWAY_CREATED"); + }); + } else if (status === "reroll") { + const messageID = args[1]; + if (!messageID) return message.error("moderation/giveaway:MISSING_ID"); + + this.client.giveawaysManager.reroll(messageID, { + messages: { + congrat: message.translate("moderation/giveaway:REROLL_CONGRAT"), + error: message.translate("moderation/giveaway:REROLL_ERROR") + } + }).then(() => { + return message.success("moderation/giveaway:GIVEAWAY_REROLLED"); + }).catch(() => { + return message.error("moderation/giveaway:NOT_FOUND_ENDED", { + messageID + }); + }); + } else if (status === "delete") { + const messageID = args[1]; + if (!messageID) return message.error("moderation/giveaway:MISSING_ID"); + + this.client.giveawaysManager.delete(messageID).then(() => { + return message.success("moderation/giveaway:GIVEAWAY_DELETED"); + }).catch(() => { + return message.error("moderation/giveaway:NOT_FOUND", { + messageID + }); + }); + } else if (status === "end") { + const messageID = args[1]; + if (!messageID) return message.error("moderation/giveaway:MISSING_ID"); + + try { + this.client.giveawaysManager.end(messageID); + return message.success("moderation/giveaway:GIVEAWAY_ENDED"); + } catch (e) { + return message.error("moderation/giveaway:NOT_FOUND", { + messageID + }); + } + } else { + return message.error("moderation/giveaway:MISSING_STATUS"); + } + } +} + +module.exports = Giveaway; \ No newline at end of file diff --git a/TO REWRITE/Moderation/kick.js b/TO REWRITE/Moderation/kick.js new file mode 100644 index 00000000..c2fbee21 --- /dev/null +++ b/TO REWRITE/Moderation/kick.js @@ -0,0 +1,100 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Kick extends Command { + constructor(client) { + super(client, { + name: "kick", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["k"], + memberPermissions: ["KICK_MEMBERS"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "KICK_MEMBERS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("moderation/kick:MISSING_MEMBER"); + + if (member.id === message.author.id) return message.error("moderation/kick:YOURSELF"); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + + // Gets the kcik reason + let reason = args.slice(1).join(" "); + if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); + + const memberPosition = member.roles.highest.position; + const moderationPosition = message.member.roles.highest.position; + if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); + if (!member.kickable) return message.error("moderation/kick:MISSING_PERM"); + + await member.send({ + content: message.translate("moderation/kick:KICKED_DM", { + username: member.user.tag, + server: message.guild.name, + moderator: message.author.tag, + reason + }) + }); + + // Kick the user + member.kick(reason).then(() => { + // Send a success message in the current channel + message.reply({ + content: message.translate("moderation/kick:KICKED", { + username: member.user.tag, + server: message.guild.name, + moderator: message.author.tag, + reason + }) + }); + + data.guild.casesCount++; + data.guild.save(); + + const caseInfo = { + channel: message.channel.id, + moderator: message.author.id, + date: Date.now(), + type: "kick", + case: data.guild.casesCount, + reason, + }; + + memberData.sanctions.push(caseInfo); + memberData.save(); + + if (data.guild.plugins.modlogs) { + const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); + if (!channel) return; + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("moderation/kick:CASE", { + count: data.guild.casesCount + }) + }) + .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) + .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) + .addField(message.translate("common:REASON"), reason, true) + .setColor("#e88709"); + channel.send({ + embeds: [embed] + }); + } + + }).catch(() => { + return message.error("moderation/kick:MISSING_PERM"); + }); + } +} + +module.exports = Kick; \ No newline at end of file diff --git a/TO REWRITE/Moderation/mute.js b/TO REWRITE/Moderation/mute.js new file mode 100644 index 00000000..4d07030b --- /dev/null +++ b/TO REWRITE/Moderation/mute.js @@ -0,0 +1,113 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + ms = require("ms"); + +class Mute extends Command { + constructor(client) { + super(client, { + name: "mute", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["m"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("moderation/mute:MISSING_MEMBER"); + if (member.id === message.author.id) return message.error("moderation/mute:YOURSELF"); + + const memberPosition = member.roles.highest.position; + const moderationPosition = message.member.roles.highest.position; + if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + + const time = args[1]; + if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME"); + let reason = args.slice(2).join(" "); + if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); + + message.guild.channels.cache.forEach((channel) => { + channel.permissionOverwrites.edit(member.id, { + SEND_MESSAGES: false, + ADD_REACTIONS: false, + CONNECT: false + }).catch(() => {}); + }); + + member.send({ + content: message.translate("moderation/mute:MUTED_DM", { + username: member.user.username, + server: message.guild.name, + moderator: message.author.tag, + time, + reason + }) + }); + + message.success("moderation/mute:MUTED", { + username: member.user.tag, + server: message.guild.name, + moderator: message.author.tag, + time, + reason + }); + + data.guild.casesCount++; + + const caseInfo = { + channel: message.channel.id, + moderator: message.author.id, + date: Date.now(), + type: "mute", + case: data.guild.casesCount, + reason, + time + }; + + memberData.mute.muted = true; + memberData.mute.endDate = Date.now() + ms(time); + memberData.mute.case = data.guild.casesCount; + memberData.sanctions.push(caseInfo); + + memberData.markModified("sanctions"); + memberData.markModified("mute"); + + await memberData.save(); + await data.guild.save(); + + this.client.databaseCache.mutedUsers.set(`${member.id}${message.guild.id}`, memberData); + + if (data.guild.plugins.modlogs) { + const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); + if (!channel) return; + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("moderation/mute:CASE", { + count: data.guild.casesCount + }) + }) + .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) + .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) + .addField(message.translate("common:REASON"), reason, true) + .addField(message.translate("common:DURATION"), time, true) + .addField(message.translate("common:EXPIRY"), this.client.printDate(new Date(Date.now() + ms(time))), true) + .setColor("#f44271"); + channel.send({ + embeds: [embed] + }); + } + } +} + +module.exports = Mute; \ No newline at end of file diff --git a/TO REWRITE/Moderation/poll.js b/TO REWRITE/Moderation/poll.js new file mode 100644 index 00000000..070c607e --- /dev/null +++ b/TO REWRITE/Moderation/poll.js @@ -0,0 +1,109 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Poll extends Command { + constructor(client) { + super(client, { + name: "poll", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["po"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const question = args.join(" "); + if (!question) return message.error("moderation/poll:MISSING_QUESTION"); + + let mention = null; + const msg = await message.sendT("moderation/announcement:MENTION_PROMPT"); + + const filter = m => m.author.id === message.author.id; + const collector = new Discord.MessageCollector(message.channel, { + filter, + time: 240000 + }); + + collector.on("collect", async (tmsg) => { + if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { + tmsg.delete(); + msg.delete(); + collector.stop(true); + + message.delete(); + } + + if (tmsg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { + tmsg.delete(); + msg.delete(); + const tmsg1 = await message.channel.send(message.translate("moderation/announcement:MENTION_TYPE_PROMPT")); + + const filter = m => m.author.id === message.author.id; + const c = new Discord.MessageCollector(message.channel, { + filter, + time: 60000 + }); + + c.on("collect", (m) => { + if (m.content.toLowerCase() === "here") { + mention = "@here"; + tmsg1.delete(); + m.delete(); + collector.stop(true); + c.stop(true); + } else if (m.content.toLowerCase() === "everyone") { + mention = "@everyone"; + tmsg1.delete(); + m.delete(); + collector.stop(true); + c.stop(true); + } + }); + + c.on("end", (collected, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + }); + + message.delete(); + } + }); + + collector.on("end", (collected, reason) => { + if (reason === "time") return message.error("misc:TIMES_UP"); + + const success = this.client.customEmojis.success.split(":")[1]; + const error = this.client.customEmojis.error.split(":")[1]; + + const emojis = [ + this.client.emojis.cache.find(e => e.name === success), + this.client.emojis.cache.find(e => e.name === error) + ]; + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("moderation/poll:TITLE") + }) + .setColor(data.config.embed.color) + .addField(question, message.translate("moderation/poll:REACT", { + success: emojis[0].toString(), + error: emojis[1].toString() + })); + + message.channel.send({ + content: mention, + embeds: [embed] + }).then(async (m) => { + await m.react(emojis[0]); + await m.react(emojis[1]); + }); + }); + } +} + +module.exports = Poll; \ No newline at end of file diff --git a/TO REWRITE/Moderation/sanctions.js b/TO REWRITE/Moderation/sanctions.js new file mode 100644 index 00000000..794267f3 --- /dev/null +++ b/TO REWRITE/Moderation/sanctions.js @@ -0,0 +1,61 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Warns extends Command { + constructor(client) { + super(client, { + name: "warns", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["ws"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const user = await this.client.resolveUser(args[0]); + if (!user) return message.error("moderation/warns:MISSING_MEMBER"); + + const memberData = await this.client.findOrCreateMember({ + id: user.id, + guildID: message.guild.id + }); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: user.tag, + iconURL: user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + if (memberData.sanctions.length < 1) { + embed.setDescription(message.translate("moderation/warns:NO_SANCTION", { + username: user.tag + })); + return message.reply({ + embeds: [embed] + }); + } else { + memberData.sanctions.forEach((s) => { + embed.addField(s.type + " | #" + s.case, `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`, true); + }); + } + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Warns; \ No newline at end of file diff --git a/TO REWRITE/Moderation/setwarns.js b/TO REWRITE/Moderation/setwarns.js new file mode 100644 index 00000000..8aebfdee --- /dev/null +++ b/TO REWRITE/Moderation/setwarns.js @@ -0,0 +1,68 @@ +const Command = require("../../base/Command"); + +class Setwarns extends Command { + constructor(client) { + super(client, { + name: "setwarns", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["setw"], + memberPermissions: ["MANAGE_GUILD"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS", "KICK_MEMBERS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const sanction = args[0]; + if (!sanction || (sanction !== "kick" && sanction !== "ban")) return message.error("moderation/setwarns:MISSING_TYPE"); + + const number = args[1]; + + if (number === "reset") { + if (sanction === "kick") { + data.guild.plugins.warnsSanctions.kick = false; + data.guild.markModified("plugins.warnsSanctions"); + data.guild.save(); + return message.success("moderation/setwarns:SUCCESS_KICK_RESET", { + prefix: data.guild.prefix, + count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` + }); + } else if (sanction === "ban") { + data.guild.plugins.warnsSanctions.ban = false; + data.guild.markModified("plugins.warnsSanctions"); + data.guild.save(); + return message.success("moderation/setwarns:SUCCESS_BAN_RESET", { + prefix: data.guild.prefix, + count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` + }); + } + } + + if (!number || isNaN(number)) return message.error("misc:INVALID_NUMBER"); + if (number < 1 || number > 10) return message.error("misc:INVALID_NUMBER_RANGE", 1, 10); + + if (sanction === "kick") { + data.guild.plugins.warnsSanctions.kick = number; + data.guild.markModified("plugins.warnsSanctions"); + data.guild.save(); + return message.success("moderation/setwarns:SUCCESS_KICK", { + prefix: data.guild.prefix, + count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` + }); + } else if (sanction === "ban") { + data.guild.plugins.warnsSanctions.ban = number; + data.guild.markModified("plugins.warnsSanctions"); + data.guild.save(); + return message.success("moderation/setwarns:SUCCESS_BAN", { + prefix: data.guild.prefix, + count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` + }); + } + } +} + +module.exports = Setwarns; \ No newline at end of file diff --git a/TO REWRITE/Moderation/unban.js b/TO REWRITE/Moderation/unban.js new file mode 100644 index 00000000..ea0468be --- /dev/null +++ b/TO REWRITE/Moderation/unban.js @@ -0,0 +1,60 @@ +const Command = require("../../base/Command"); + +class Unban extends Command { + constructor(client) { + super(client, { + name: "unban", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["ub"], + memberPermissions: ["BAN_MEMBERS"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + let user = null; + + if (!args[0]) return message.error("moderation/unban:MISSING_ID"); + + // Check if the arg is an ID or a username + const isId = !isNaN(args[0]); + + if (isId) { + // Try to find a user with that ID + await this.client.users.fetch(args[0]).then((u) => { + // if a user was found + user = u; + }).catch(() => {}); + } else if (!isId) { + const arr = args[0].split("#"); + if (arr.length < 2) { + return message.error("misc:NO_USER_FOUND_ID", { + id: args[0] + }); + } + user = this.client.users.filter((u) => u.username === arr[0]).find((u) => u.discriminator === arr[1]); + } + + if (!user) return message.error("misc:NO_USER_FOUND_ID", { id: args[0] }); + + // check if the user is banned + const banned = await message.guild.bans.fetch(); + if (!banned.some((e) => e.user.id === user.id)) return message.success("moderation/unban:NOT_BANNED", { username: user.tag }); + + // Unban user + message.guild.members.unban(user).catch(() => {}); + + // Send a success message in the current channel + message.success("moderation/unban:UNBANNED", { + username: user.tag, + server: message.guild.name + }); + } +} + +module.exports = Unban; \ No newline at end of file diff --git a/TO REWRITE/Moderation/unmute.js b/TO REWRITE/Moderation/unmute.js new file mode 100644 index 00000000..6a8fb313 --- /dev/null +++ b/TO REWRITE/Moderation/unmute.js @@ -0,0 +1,47 @@ +const Command = require("../../base/Command"); + +class Unmute extends Command { + constructor(client) { + super(client, { + name: "unmute", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["um"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.success("moderation/unmute:MISSING_MEMBER"); + + const memberPosition = member.roles.highest.position; + const moderationPosition = message.member.roles.highest.position; + if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + + if (memberData.mute.muted) { + memberData.mute.endDate = Date.now(); + memberData.markModified("mute"); + memberData.save(); + message.success("moderation/unmute:SUCCESS", { + username: member.user.tag + }); + } else { + message.error("moderation/unmute:NOT_MUTED", { + username: member.user.tag + }); + } + } +} + +module.exports = Unmute; \ No newline at end of file diff --git a/TO REWRITE/Moderation/warn.js b/TO REWRITE/Moderation/warn.js new file mode 100644 index 00000000..698978fc --- /dev/null +++ b/TO REWRITE/Moderation/warn.js @@ -0,0 +1,144 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Warn extends Command { + constructor(client) { + super(client, { + name: "warn", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["w"], + memberPermissions: ["MANAGE_MESSAGES"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const member = await this.client.resolveMember(args[0], message.guild); + if (!member) return message.error("moderation/warn:MISSING_MEMBER"); + if (member.user.bot) return message.error("misc:BOT_USER"); + + const memberData = await this.client.findOrCreateMember({ + id: member.id, + guildID: message.guild.id + }); + + if (member.id === message.author.id) return message.error("moderation/warn:YOURSELF"); + + const memberPosition = member.roles.highest.position; + const moderationPosition = message.member.roles.highest.position; + if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); + + const reason = args.slice(1).join(" "); + if (!reason) return message.error("moderation/warn:MISSING_REASON"); + + // Gets current member sanctions + const sanctions = memberData.sanctions.filter((s) => s.type === "warn").length; + const banCount = data.guild.plugins.warnsSanctions.ban; + const kickCount = data.guild.plugins.warnsSanctions.kick; + + data.guild.casesCount++; + data.guild.save(); + + const caseInfo = { + channel: message.channel.id, + moderator: message.author.id, + date: Date.now(), + type: "warn", + case: data.guild.casesCount, + reason + }; + + const embed = new Discord.MessageEmbed() + .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`) + .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`) + .addField(message.translate("common:REASON"), reason, true); + + if (banCount) { + if (sanctions >= banCount) { + member.send({ + content: message.translate("moderation/ban:BANNED_DM", { + username: member.user, + moderator: message.author.tag, + server: message.guild.name, + reason + }) + }); + caseInfo.type = "ban"; + embed.setAuthor({ + name: message.translate("moderation/ban:CASE", { + count: data.guild.casesCount + }) + }) + .setColor("#e02316"); + message.guild.members.ban(member).catch(() => {}); + message.success("moderation/setwarns:AUTO_BAN", { + username: member.user.tag, + count: banCount + }); + } + } + + if (kickCount) { + if (sanctions >= kickCount) { + member.send({ + content: message.translate("moderation/kick:KICKED_DM", { + username: member.user, + moderator: message.author.tag, + server: message.guild.name, + reason + }) + }); + caseInfo.type = "kick"; + embed.setAuthor({ + name: message.translate("moderation/kick:CASE", { + count: data.guild.casesCount + }) + }) + .setColor("#e88709"); + member.kick().catch(() => {}); + message.success("moderation/setwarns:AUTO_KICK", { + username: member.user.tag, + count: kickCount + }); + } + } + + member.send({ + content: message.translate("moderation/warn:WARNED_DM", { + username: member.user.tag, + server: message.guild.name, + moderator: message.author.tag, + reason + }) + }); + caseInfo.type = "warn"; + embed.setAuthor({ + name: message.translate("moderation/warn:CASE", { + caseNumber: data.guild.casesCount + }) + }) + .setColor("#8c14e2"); + message.success("moderation/warn:WARNED", { + username: member.user.tag, + reason + }); + + memberData.sanctions.push(caseInfo); + memberData.save(); + + if (data.guild.plugins.modlogs) { + const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); + if (!channel) return; + channel.send({ + embeds: [embed] + }); + } + } +} + +module.exports = Warn; \ No newline at end of file diff --git a/TO REWRITE/Music/autoplay.js b/TO REWRITE/Music/autoplay.js new file mode 100644 index 00000000..2372c601 --- /dev/null +++ b/TO REWRITE/Music/autoplay.js @@ -0,0 +1,32 @@ +const Command = require("../../base/Command"); + +class AutoPlay extends Command { + constructor(client) { + super(client, { + name: "autoplay", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["autop"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + + const autoplay = queue.toggleAutoplay(); + + message.success(`music/autoplay:SUCCESS_${autoplay ? "ENABLED" : "DISABLED"}`); + } +} + +module.exports = AutoPlay; \ No newline at end of file diff --git a/TO REWRITE/Music/back.js b/TO REWRITE/Music/back.js new file mode 100644 index 00000000..e5fac879 --- /dev/null +++ b/TO REWRITE/Music/back.js @@ -0,0 +1,50 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Back extends Command { + constructor(client) { + super(client, { + name: "back", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["previous"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args, data) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + if (!queue.previousSongs[0]) return message.error("music/back:NO_PREV_SONG"); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("music/back:DESCRIPTION") + }) + .setThumbnail(queue.tracks[0].thumbnail) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }); + + const m = await message.reply({ + embeds: [embed] + }); + + this.client.player.previous(message); + embed.setDescription(message.translate("music/back:SUCCESS")); + m.edit({ + embeds: [embed] + }); + } +} + +module.exports = Back; \ No newline at end of file diff --git a/TO REWRITE/Music/clip.js b/TO REWRITE/Music/clip.js new file mode 100644 index 00000000..de287a0e --- /dev/null +++ b/TO REWRITE/Music/clip.js @@ -0,0 +1,58 @@ +const Command = require("../../base/Command"), + fs = require("fs"), + { joinVoiceChannel, createAudioResource, createAudioPlayer, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice"); + +class Clip extends Command { + constructor(client) { + super(client, { + name: "clip", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + const clip = args[0]; + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (getVoiceConnection(message.guild.id)) return message.error("music/clip:ACTIVE_CLIP"); + if (queue) return message.error("music/clip:ACTIVE_QUEUE"); + if (!clip) return message.error("music/clip:NO_ARG"); + if (!fs.existsSync(`./clips/${clip}.mp3`)) return message.error("music/clip:NO_FILE", { file: clip }); + + try { + const connection = joinVoiceChannel({ + channelId: voice.id, + guildId: message.guild.id, + adapterCreator: message.guild.voiceAdapterCreator + }); + + const resource = createAudioResource(fs.createReadStream(`./clips/${clip}.mp3`)); + const player = createAudioPlayer() + .on("error", err => { + connection.destroy(); + console.error(err.message); + }); + + player.play(resource); + connection.subscribe(player); + + player.on(AudioPlayerStatus.Idle, () => { + connection.destroy(); + }); + } catch (error) { + console.error(error); + } + } +} + +module.exports = Clip; \ No newline at end of file diff --git a/TO REWRITE/Music/clips.js b/TO REWRITE/Music/clips.js new file mode 100644 index 00000000..e687a05a --- /dev/null +++ b/TO REWRITE/Music/clips.js @@ -0,0 +1,46 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + fs = require("fs"); + +class Clips extends Command { + constructor(client) { + super(client, { + name: "clips", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 2000 + }); + } + + async run(message, args, data) { + fs.readdir("./clips", function (err, files) { + if (err) return console.log("Unable to read directory: " + err); + + const clips = []; + + files.forEach(function (file) { + clips.push(file.substring(0, file.length - 4)); + }); + + const embed = new Discord.MessageEmbed() + .setTitle(message.translate("music/clips:EMBED_TITLE")) + .setDescription(clips.join("\n")) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setTimestamp(); + message.reply({ + embeds: [embed] + }); + }); + } +} + +module.exports = Clips; \ No newline at end of file diff --git a/TO REWRITE/Music/jump.js b/TO REWRITE/Music/jump.js new file mode 100644 index 00000000..0006e4fa --- /dev/null +++ b/TO REWRITE/Music/jump.js @@ -0,0 +1,53 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Jump extends Command { + constructor(client) { + super(client, { + name: "jump", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["j"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args, data) { + const queue = this.client.player.getQueue(message); + const voice = message.member.voice.channel; + const number = parseInt(args[0]); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + if (number < 0) return message.error("music/jump:NO_PREV_SONG", { prefix: data.guild.prefix }); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("music/jump:SUCCESS") + }) + .setThumbnail(queue.songs[number].thumbnail) + .setFooter({ + text: data.config.embed.footer + }) + .setColor(data.config.embed.color); + + const m = await message.reply({ + embeds: [embed] + }); + + this.client.player.jump(message, number); + embed.setDescription(message.translate("music/play:NOW_PLAYING", { + songName: queue.songs[number].name + })); + m.edit({ + embeds: [embed] + }); + } +} + +module.exports = Jump; \ No newline at end of file diff --git a/TO REWRITE/Music/loop.js b/TO REWRITE/Music/loop.js new file mode 100644 index 00000000..05a19d7a --- /dev/null +++ b/TO REWRITE/Music/loop.js @@ -0,0 +1,40 @@ +const Command = require("../../base/Command"); + +class Loop extends Command { + constructor(client) { + super(client, { + name: "loop", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["repeat", "l"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + + const type = args[0]; + let mode = null; + if (type === "queue" || type === "all") { + mode = this.client.player.setRepeatMode(message, 2); + } else if (type === "song" || type === "single") { + mode = this.client.player.setRepeatMode(message, 1); + } else { + mode = this.client.player.setRepeatMode(message, 0); + } + + message.success(`music/loop:${mode ? mode === 2 ? "QUEUE" : "SONG" : "DISABLED"}`); + } +} + +module.exports = Loop; \ No newline at end of file diff --git a/TO REWRITE/Music/np.js b/TO REWRITE/Music/np.js new file mode 100644 index 00000000..08a5d85a --- /dev/null +++ b/TO REWRITE/Music/np.js @@ -0,0 +1,63 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Np extends Command { + constructor(client) { + super(client, { + name: "np", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["nowplaying"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args, data) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + + const track = queue.songs[0]; + + const status = queue => + `${message.translate("music/np:FILTERS")}: \`${ + queue.filters.join(", ") || message.translate("music/np:DISABLED") + }\` | ${message.translate("music/np:REPEAT")}: \`${ + queue.repeatMode + ? queue.repeatMode === 2 ? message.translate("music/np:QUEUE") : message.translate("music/np:SONG") + : message.translate("music/np:DISABLED") + }\` | ${message.translate("music/np:AUTOPLAY")}: \`${ + queue.autoplay + ? message.translate("music/np:ENABLED") + : message.translate("music/np:DISABLED") + }\``; + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("music/queue:TITLE") + }) + .setThumbnail(track.thumbnail) + .addField(message.translate("music/np:T_TITLE"), `[${track.name}](${track.url})`) + .addField(message.translate("music/np:T_CHANNEL"), track.uploader.name ? track.uploader.name : "Отсутствует") + .addField(message.translate("music/np:T_DURATION"), `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}`) + .addField(message.translate("music/np:T_CONF"), status(queue)) + .setColor(data.config.embed.color) + .setFooter({ + text: data.config.embed.footer + }) + .setTimestamp(); + + message.reply({ + embeds: [embed] + }); + } +} + +module.exports = Np; \ No newline at end of file diff --git a/TO REWRITE/Music/pause.js b/TO REWRITE/Music/pause.js new file mode 100644 index 00000000..efa90801 --- /dev/null +++ b/TO REWRITE/Music/pause.js @@ -0,0 +1,32 @@ +const Command = require("../../base/Command"); + +class Pause extends Command { + constructor(client) { + super(client, { + name: "pause", + dirname: __dirname, + enabled: false, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music:play:NOT_PLAYING"); + + await this.client.player.pause(message); + + message.sendT("music/pause:SUCCESS"); + } +} + +module.exports = Pause; \ No newline at end of file diff --git a/TO REWRITE/Music/play.js b/TO REWRITE/Music/play.js new file mode 100644 index 00000000..8ae57349 --- /dev/null +++ b/TO REWRITE/Music/play.js @@ -0,0 +1,45 @@ +const Command = require("../../base/Command"), + { Permissions } = require("discord.js"); + +class Play extends Command { + constructor(client) { + super(client, { + name: "play", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["p"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args) { + const voice = message.member.voice.channel; + const name = args.join(" "); + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!name) return message.error("music/play:MISSING_SONG_NAME"); + + // Check my permissions + const perms = voice.permissionsFor(this.client.user); + if (!perms.has(Permissions.FLAGS.CONNECT) || !perms.has(Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); + + try { + this.client.player.play(message.member.voice.channel, args.join(" "), { + member: message.member, + textChannel: message.channel, + message + }); + } catch (e) { + message.error("music/play:ERR_OCCURRED", { + error: e + }); + console.error(e); + } + } +} + +module.exports = Play; \ No newline at end of file diff --git a/TO REWRITE/Music/queue.js b/TO REWRITE/Music/queue.js new file mode 100644 index 00000000..972f0768 --- /dev/null +++ b/TO REWRITE/Music/queue.js @@ -0,0 +1,66 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"), + Pagination = require("discord-paginationembed"); + +class Queue extends Command { + constructor(client) { + super(client, { + name: "queue", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["q"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args, data) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + + if (queue.songs.length === 1) { + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("music/queue:TITLE"), + iconURL: message.guild.iconURL({ + dynamic: true + }) + }) + .addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`) + .setColor(data.config.embed.color); + return message.reply({ + embeds: [embed] + }); + } + + const FieldsEmbed = new Pagination.FieldsEmbed(); + + FieldsEmbed.embed + .setColor(data.config.embed.color) + .setAuthor({ + name: message.translate("music/queue:TITLE"), + iconURL: message.guild.iconURL({ + dynamic: true + }) + }) + .addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`); + FieldsEmbed + .setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : []) + .setAuthorizedUsers([message.author.id]) + .setChannel(message.channel) + .setElementsPerPage(5) + .setDeleteOnTimeout(true) + .setPageIndicator(true) + .formatField(message.translate("music/queue:TITLE"), (track) => `**${queue.songs.indexOf(track)}**. [${track.name}](${track.url})\n*${message.translate("music/queue:ADDED")} ${track.member}*\n`) + .build(); + } +} + +module.exports = Queue; \ No newline at end of file diff --git a/TO REWRITE/Music/resume.js b/TO REWRITE/Music/resume.js new file mode 100644 index 00000000..b056d6eb --- /dev/null +++ b/TO REWRITE/Music/resume.js @@ -0,0 +1,32 @@ +const Command = require("../../base/Command"); + +class Resume extends Command { + constructor(client) { + super(client, { + name: "resume", + dirname: __dirname, + enabled: false, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music:play:NOT_PLAYING"); + + await this.client.player.resume(message); + + message.sendT("music/resume:SUCCESS"); + } +} + +module.exports = Resume; \ No newline at end of file diff --git a/TO REWRITE/Music/seek.js b/TO REWRITE/Music/seek.js new file mode 100644 index 00000000..5501b67f --- /dev/null +++ b/TO REWRITE/Music/seek.js @@ -0,0 +1,35 @@ +const Command = require("../../base/Command"); +const ms = require("ms"); + +class Seek extends Command { + constructor(client) { + super(client, { + name: "seek", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: [], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + const time = ms(args[0]) / 1000; + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + if (isNaN(time)) return message.error("music/seek:INVALID_TIME"); + + await this.client.player.seek(message, time); + + message.sendT("music/seek:SUCCESS"); + } +} + +module.exports = Seek; \ No newline at end of file diff --git a/TO REWRITE/Music/skip.js b/TO REWRITE/Music/skip.js new file mode 100644 index 00000000..ff403bc5 --- /dev/null +++ b/TO REWRITE/Music/skip.js @@ -0,0 +1,52 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Skip extends Command { + constructor(client) { + super(client, { + name: "skip", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["s"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args, data) { + const voice = message.member.voice.channel; + const queue = this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + if (!queue.songs[1]) return message.error("music/skip:NO_NEXT_SONG"); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("music/skip:SUCCESS") + }) + .setThumbnail(queue.songs[1].thumbnail) + .setFooter({ + text: data.config.embed.footer + }) + .setColor(data.config.embed.color); + + const m = await message.reply({ + embeds: [embed] + }); + + this.client.player.skip(message); + embed.setDescription(message.translate("music/play:NOW_PLAYING", { + songName: queue.songs[1].name + })); + m.edit({ + embeds: [embed] + }); + } +} + +module.exports = Skip; \ No newline at end of file diff --git a/TO REWRITE/Music/stop.js b/TO REWRITE/Music/stop.js new file mode 100644 index 00000000..6607bf89 --- /dev/null +++ b/TO REWRITE/Music/stop.js @@ -0,0 +1,48 @@ +const Command = require("../../base/Command"), + Discord = require("discord.js"); + +class Stop extends Command { + constructor(client) { + super(client, { + name: "stop", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["leave", "st"], + memberPermissions: [], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], + nsfw: false, + ownerOnly: false, + cooldown: 3000 + }); + } + + async run(message, args, data) { + const voice = message.member.voice.channel; + const queue = await this.client.player.getQueue(message); + + if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return message.error("music/play:NOT_PLAYING"); + + const embed = new Discord.MessageEmbed() + .setAuthor({ + name: message.translate("music/stop:DESCRIPTION") + }) + .setFooter({ + text: data.config.embed.footer + }) + .setColor(data.config.embed.color); + + const m = await message.reply({ + embeds: [embed] + }); + + this.client.player.stop(message); + embed.setDescription(message.translate("music/stop:SUCCESS")); + m.edit({ + embeds: [embed] + }); + } +} + +module.exports = Stop; \ No newline at end of file diff --git a/base/JaBa.js b/base/JaBa.js index 7de8e4ed..fb025bba 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -122,37 +122,39 @@ class JaBa extends Client { * @param {String} dir * @returns */ + async loadCommands(dir) { const filePath = path.join(__dirname, dir); - const files = await fs.readdir(filePath); + var folders = await fs.readdir(filePath); folders = folders.map(file => path.join(filePath, file)).filter(async (path) => { path = await fs.lstat(path); path.isDirectory(); }); const rest = new REST({ version: "9" }).setToken(this.config.token); const commands = []; - const guild_commands = []; - for (let index = 0; index < files.length; index++) { - const file = files[index]; - const stat = await fs.lstat(path.join(filePath, file)); - if (stat.isDirectory()) this.loadCommands(path.join(dir, file)); + for (let index = 0; index < folders.length; index++) { + const folder = folders[index]; + const files = await fs.readdir(folder); - if (file.endsWith(".js")) { - const Command = require(path.join(filePath, file)); - if (Command.prototype instanceof BaseCommand) { - const command = new Command(this); - this.commands.set(command.command.name, command); - const aliases = []; - if (command.aliases && Array.isArray(command.aliases) && command.aliases.length > 0) { - command.aliases.forEach((alias) => { - const command_alias = command.command instanceof SlashCommandBuilder ? { ...command.command.toJSON() } : { ...command.command }; - command_alias.name = alias; - aliases.push(command_alias); - this.commands.set(alias, command); - }); + for (let index = 0; index < files.length; index++) { + const file = files[index]; + + if (file.endsWith(".js")) { + const Command = require(path.join(folder, file)); + if (Command.prototype instanceof BaseCommand) { + const command = new Command(this); + this.commands.set(command.command.name, command); + const aliases = []; + if (command.aliases && Array.isArray(command.aliases) && command.aliases.length > 0) { + command.aliases.forEach((alias) => { + const command_alias = command.command instanceof SlashCommandBuilder ? { ...command.command.toJSON() } : { ...command.command }; + command_alias.name = alias; + aliases.push(command_alias); + this.commands.set(alias, command); + }); + } + + commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + + if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); + this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`); } - - if (!this.config.production) guild_commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); - else commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); - - if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); - this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`); } } } @@ -161,7 +163,7 @@ class JaBa extends Client { if (!this.config.production) { await rest.put( Routes.applicationGuildCommands(this.config.user, this.config.support.id), { - body: guild_commands + body: commands } ); } else { @@ -184,9 +186,6 @@ class JaBa extends Client { * @param {String} file */ async loadCommand(dir, file) { - const commands = []; - const guild_commands = []; - const rest = new REST({ version: "9" }).setToken(this.config.token); const Command = require(path.join(dir, `${file}.js`)); if (Command.prototype instanceof BaseCommand) { const command = new Command(this); @@ -201,32 +200,9 @@ class JaBa extends Client { }); } - if (!this.config.production) guild_commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); - else commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); - if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`); - try { - if (!this.config.production) { - await rest.put( - Routes.applicationGuildCommands(this.config.user, this.config.support.id), { - body: guild_commands - } - ); - } else { - await rest.put( - Routes.applicationCommands(this.config.user), { - body: commands - } - ); - } - - this.logger.log("Successfully registered application commands."); - } catch (err) { - this.logger.log("Cannot load commands: " + err.message, "error"); - } - return; } } @@ -412,70 +388,6 @@ class JaBa extends Client { } } } - - async resolveUser(search) { - let user = null; - if (!search || typeof search !== "string") return; - - // Try ID search - if (search.match(/^<@!?(\d+)>$/)) { - const id = search.match(/^<@!?(\d+)>$/)[1]; - user = this.users.fetch(id).catch(() => {}); - if (user) return user; - } - - // Try username search - if (search.match(/^!?(\w+)#(\d+)$/)) { - const username = search.match(/^!?(\w+)#(\d+)$/)[0]; - const discriminator = search.match(/^!?(\w+)#(\d+)$/)[1]; - user = this.users.find((u) => u.username === username && u.discriminator === discriminator); - if (user) return user; - } - user = await this.users.fetch(search).catch(() => {}); - - return user; - } - - async resolveMember(search, guild) { - let member = null; - if (!search || typeof search !== "string") return; - - // Try ID search - if (search.match(/^<@!?(\d+)>$/)) { - const id = search.match(/^<@!?(\d+)>$/)[1]; - member = await guild.members.fetch(id).catch(() => {}); - if (member) return member; - } - - // Try username search - if (search.match(/^!?(\w+)#(\d+)$/)) { - guild = await guild.fetch(); - member = guild.members.cache.find((m) => m.user.tag === search); - if (member) return member; - } - member = await guild.members.fetch(search).catch(() => {}); - - return member; - } - - async resolveRole(search, guild) { - let role = null; - if (!search || typeof search !== "string") return; - - // Try ID search - if (search.match(/^<@&!?(\d+)>$/)) { - const id = search.match(/^<@&!?(\d+)>$/)[1]; - role = guild.roles.cache.get(id); - if (role) return role; - } - - // Try name search - role = guild.roles.cache.find((r) => search === r.name); - if (role) return role; - role = guild.roles.cache.get(search); - - return role; - } } module.exports = JaBa; \ No newline at end of file diff --git a/commands/General/ping.js b/commands/General/ping.js new file mode 100644 index 00000000..470d6fd7 --- /dev/null +++ b/commands/General/ping.js @@ -0,0 +1,40 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const BaseCommand = require("../../base/BaseCommand"); + +class Ping extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("ping") + .setDescription(client.translate("general/ping:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + interaction.replyT("general/ping:CONTENT", { + ping: Math.round(client.ws.ping) + }); + } +} + +module.exports = Ping; \ No newline at end of file diff --git a/commands/NSFW/nsfw.js b/commands/NSFW/nsfw.js new file mode 100644 index 00000000..2191d2ec --- /dev/null +++ b/commands/NSFW/nsfw.js @@ -0,0 +1,86 @@ + +const { SlashCommandBuilder } = require("@discordjs/builders"), + { MessageEmbed, MessageActionRow, MessageSelectMenu, InteractionCollector } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + fetch = require("node-fetch"); + +class NSFW extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("nsfw") + .setDescription(client.translate("nsfw/nsfw:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + if (!interaction.channel.nsfw) return interaction.replyT("misc:NSFW_COMMAND", null, { ephemeral: true }); + + const tags = ["hentai", "ecchi", "lewdanimegirls", "hentaifemdom", "animefeets", "animebooty", "biganimetiddies", "sideoppai", "ahegao"].map(tag => + JSON.parse(JSON.stringify({ + label: tag, + description: "", + value: tag + })) + ); + + const row = new MessageActionRow() + .addComponents( + new MessageSelectMenu() + .setCustomId("nsfw_select") + .setPlaceholder(client.translate("nsfw/nsfw:NOTHING_SELECTED")) + .addOptions(tags) + ); + + const msg = await interaction.reply({ + content: interaction.translate("nsfw/nsfw:AVAILABLE_CATEGORIES"), + ephemeral: true, + components: [row] + }); + + const collector = new InteractionCollector(client, { + message: msg, + time: 60 * 1000 + }); + + collector.on("collect", async (msg) => { + const tag = msg?.values[0]; + const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); + + const embed = new MessageEmbed() + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }) + .setTitle(`${res.title}\n${interaction.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${interaction.translate("common:AUTHOR")}: ${res.author}\n${interaction.translate("fun/memes:UPS")}: ${res.ups}`) + .setImage(res.url) + .setTimestamp(); + + msg.update({ + embeds: [embed] + }); + }); + } +} + +module.exports = NSFW; \ No newline at end of file diff --git a/commands/Owner/debug.js b/commands/Owner/debug.js new file mode 100644 index 00000000..4cdc1085 --- /dev/null +++ b/commands/Owner/debug.js @@ -0,0 +1,190 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const BaseCommand = require("../../base/BaseCommand"); + +class Debug extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("debug") + .setDescription(client.translate("owner/debug:DESCRIPTION")) + .addSubcommand(subcommand => + subcommand.setName("set") + .setDescription(client.translate("owner/debug:SET")) + .addStringOption(option => + option.setName("type") + .setDescription(client.translate("owner/debug:TYPE")) + .setRequired(true) + .addChoices( + { name: client.translate("common:LEVEL"), value: "level" }, + { name: client.translate("common:XP"), value: "xp" }, + { name: client.translate("common:CREDITS"), value: "credits" }, + { name: client.translate("economy/transactions:BANK"), value: "bank" }, + { name: client.translate("common:REP"), value: "rep" }, + )) + .addUserOption(option => + option.setName("target") + .setDescription(client.translate("owner/debug:TARGET")) + .setRequired(true)) + .addIntegerOption(option => + option.setName("int") + .setDescription(client.translate("owner/debug:INT")) + .setRequired(true)) + ) + .addSubcommand(subcommand => + subcommand.setName("add") + .setDescription(client.translate("owner/debug:ADD")) + .addStringOption(option => + option.setName("type") + .setDescription(client.translate("owner/debug:TYPE")) + .setRequired(true) + .addChoices( + { name: client.translate("common:LEVEL"), value: "level" }, + { name: client.translate("common:XP"), value: "xp" }, + { name: client.translate("common:CREDITS"), value: "credits" }, + { name: client.translate("economy/transactions:BANK"), value: "bank" }, + { name: client.translate("common:REP"), value: "rep" }, + )) + .addUserOption(option => + option.setName("target") + .setDescription(client.translate("owner/debug:TARGET")) + .setRequired(true)) + .addIntegerOption(option => + option.setName("int") + .setDescription(client.translate("owner/debug:INT")) + .setRequired(true)) + ), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction, data) { + const action = interaction.options.getSubcommand(); + + if (action === "set") { + const type = interaction.options.getString("type"); + const member = interaction.options.getMember("target"); + const int = interaction.options.getInteger("int"); + if (member.user.bot) return interaction.error("owner/debug:BOT"); + + switch (type) { + case "level": { + data.memberData.level = int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "xp": { + data.memberData.exp = int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "credits": { + data.memberData.money = int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "bank": { + data.memberData.bankSold = int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "rep": { + data.memberData.rep = int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + } + } else { + const type = interaction.options.getString("type"); + const member = interaction.options.getMember("target"); + const int = interaction.options.getInteger("int"); + if (member.user.bot) return interaction.error("owner/debug:BOT", { ephemeral: true }); + + switch (type) { + case "level": { + data.memberData.level += int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "xp": { + data.memberData.exp += int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "credits": { + data.memberData.money += int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "bank": { + data.memberData.bankSold += int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + + case "rep": { + data.memberData.rep += int; + await data.memberData.save(); + return interaction.success("owner/debug:SUCCESS_" + type.toUpperCase(), { + username: member.user.tag, + amount: int + }, { ephemeral: true }); + } + } + } + } +} + +module.exports = Debug; \ No newline at end of file diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js index 86ab17d3..0e1ff34b 100644 --- a/commands/Owner/eval.js +++ b/commands/Owner/eval.js @@ -16,7 +16,7 @@ class Eval extends BaseCommand { option.setName("code") .setDescription(client.translate("owner/eval:USAGE")) .setRequired(true)), - aliases: ["e"], + aliases: [], dirname: __dirname, guildOnly: true, ownerOnly: true diff --git a/commands/Owner/reload.js b/commands/Owner/reload.js index bd533f5e..10e48a3c 100644 --- a/commands/Owner/reload.js +++ b/commands/Owner/reload.js @@ -37,11 +37,9 @@ class Reload extends BaseCommand { * @param {Array} data */ async execute(client, interaction) { - interaction.deferReply({ ephemeral: true }); - const command = interaction.options.getString("command"); const cmd = client.commands.get(command); - if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { search: command }); + if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { search: command }, { ephemeral: true }); await client.unloadCommand(`../commands/${cmd.category}`, cmd.command.name); await client.loadCommand(`../commands/${cmd.category}`, cmd.command.name); @@ -51,7 +49,7 @@ class Reload extends BaseCommand { interaction.success("owner/reload:SUCCESS", { command: cmd.command.name - }, { edit: true, ephemeral: true }); + }, { ephemeral: true }); } } diff --git a/commands/Owner/say.js b/commands/Owner/say.js new file mode 100644 index 00000000..e13243bf --- /dev/null +++ b/commands/Owner/say.js @@ -0,0 +1,75 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"); +const BaseCommand = require("../../base/BaseCommand"); + +class Say extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("say") + .setDescription(client.translate("owner/say:DESCRIPTION")) + .addStringOption(option => + option.setName("message") + .setDescription(client.translate("owner/say:MESSAGE")) + .setRequired(true)) + .addChannelOption(option => + option.setName("channel") + .setDescription(client.translate("owner/say:CHANNEL"))), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + interaction.deferReply({ ephemeral: true }); + const message = interaction.options.getString("message"); + const channel = interaction.options.getChannel("channel"); + + if (!channel) { + interaction.channel.sendTyping(); + + setTimeout(function () { + interaction.channel.send({ + content: message + }); + + interaction.replyT("owner/say:DONE", { + message, + channel: interaction.channel.toString() + }, { edit: true }); + }, 2000); + } else { + channel.sendTyping(); + + setTimeout(function () { + channel.send({ + content: message + }); + + interaction.replyT("owner/say:DONE", { + message, + channel: channel.toString() + }, { edit: true }); + }, 2000); + } + } +} + +module.exports = Say; \ No newline at end of file diff --git a/commands/Owner/servers.js b/commands/Owner/servers.js new file mode 100644 index 00000000..7039000d --- /dev/null +++ b/commands/Owner/servers.js @@ -0,0 +1,134 @@ +const { SlashCommandBuilder } = require("@discordjs/builders"), + { MessageEmbed } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Servers extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("servers") + .setDescription(client.translate("owner/servers:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + let i0 = 0, + i1 = 10, + page = 1; + + let description = `${interaction.translate("common:SERVERS")}: ${client.guilds.cache.size}\n\n` + + client.guilds.cache + .sort((a, b) => b.memberCount - a.memberCount) + .map((r) => r) + .map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${client.getNoun(r.memberCount, interaction.translate("misc:NOUNS:MEMBERS:1"), interaction.translate("misc:NOUNS:MEMBERS:2"), interaction.translate("misc:NOUNS:MEMBERS:5"))}`) + .slice(0, 10) + .join("\n"); + + const embed = new MessageEmbed() + .setAuthor({ + name: interaction.user.tag, + iconURL: interaction.user.displayAvatarURL({ + size: 512, + dynamic: true, + format: "png" + }) + }) + .setColor(client.config.embed.color) + .setFooter({ + text: client.user.username + }) + .setTitle(`${interaction.translate("common:PAGE")}: ${page}/${client.guilds.cache.size}`) + .setDescription(description); + + await interaction.reply({ + embeds: [embed], + }); + + const msg = await interaction.fetchReply(); + + await msg.react("⬅"); + await msg.react("➡"); + await msg.react("❌"); + + const collector = msg.createReactionCollector({ + time: 60 * 1000 + }); + + collector.on("collect", async (reaction) => { + if (reaction._emoji.name === "⬅") { + i0 = i0 - 10; + i1 = i1 - 10; + page = page - 1; + + if (i0 < 0) return msg.delete(); + if (!i0 || !i1) return msg.delete(); + + description = `${interaction.translate("common:SERVERS")}: ${client.guilds.cache.size}\n\n` + + client.guilds.cache + .sort((a, b) => b.memberCount - a.memberCount) + .map((r) => r) + .map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${client.getNoun(r.memberCount, interaction.translate("misc:NOUNS:MEMBERS:1"), interaction.translate("misc:NOUNS:MEMBERS:2"), interaction.translate("misc:NOUNS:MEMBERS:5"))}`) + .slice(i0, i1) + .join("\n"); + + embed + .setTitle(`${interaction.translate("common:PAGE")}: ${page}/${client.guilds.cache.size}`) + .setDescription(description); + + msg.edit({ + embeds: [embed] + }); + } + + if (reaction._emoji.name === "➡") { + i0 = i0 + 10; + i1 = i1 + 10; + page = page + 1; + + if (i1 > client.guilds.cache.size + 10) return msg.delete(); + if (!i0 || !i1) return msg.delete(); + + description = `${interaction.translate("common:SERVERS")}: ${client.guilds.cache.size}\n\n` + + client.guilds.cache + .sort((a, b) => b.memberCount - a.memberCount) + .map((r) => r) + .map((r, i) => `**${i + 1}** - ${r.name} | ${r.memberCount} ${client.getNoun(r.memberCount, interaction.translate("misc:NOUNS:MEMBERS:1"), interaction.translate("misc:NOUNS:MEMBERS:2"), interaction.translate("misc:NOUNS:MEMBERS:5"))}`) + .slice(i0, i1) + .join("\n"); + + embed.setTitle(`${interaction.translate("common:PAGE")}: ${page}/${Math.round(client.guilds.cache.size / 10)}`) + .setDescription(description); + + msg.edit({ + embeds: [embed] + }); + } + + if (reaction._emoji.name === "❌") return msg.delete(); + + await reaction.users.remove(interaction.user.id); + }); + } +} + +module.exports = Servers; \ No newline at end of file diff --git a/events/ready.js b/events/ready.js index f7640c62..754d4b97 100644 --- a/events/ready.js +++ b/events/ready.js @@ -56,6 +56,7 @@ class Ready extends BaseEvent { ]; let i = 0; + setTimeout setInterval(async function () { hiddenGuild = await client.guilds.fetch("568120814776614924"); tUsers = client.users.cache.size - hiddenGuild.memberCount; diff --git a/helpers/autoUpdateDocs.js b/helpers/autoUpdateDocs.js index cb1f05fb..a350e11d 100644 --- a/helpers/autoUpdateDocs.js +++ b/helpers/autoUpdateDocs.js @@ -1,18 +1,23 @@ +const table = require("markdown-table"), + fs = require("fs"); + module.exports.update = function (client) { - const table = require("markdown-table"), - fs = require("fs"), - commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()], + const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()], categories = []; + commands.forEach((cmd) => { if (!categories.includes(cmd.category)) categories.push(cmd.category); }); + let text = `# JaBa имеет **${commands.length} ${client.getNoun(commands.length, "команда", "команды", "команд")}** в **${categories.length} ${client.getNoun(categories.length, "категории", "категориях", "категориях")}**! \n\n#### Содержимое таблицы \n**Название**: Название команды \n**Описание**: Описание команды \n**Использование**: Использование команды ( [] - обязательно, () - необязательно ) \n**Разрешено использование**: Где можно использовать команду \n\n`; + // categories.sort(function(a, b) { // const aCmdsSize = commands.filter((cmd) => cmd.category === a).size; // const bCmdsSize = commands.filter((cmd) => cmd.category === b).size; // if (aCmdsSize > bCmdsSize) return -1; // else return 1; // }) + categories.sort().forEach((cat) => { const categoriesArray = [ ["Название", "Описание", "Использование", "Разрешено использование"] @@ -33,6 +38,7 @@ module.exports.update = function (client) { }); text += `${table(categoriesArray)}\n\n`; }); + if (!fs.existsSync("./dashboard/public/docs")) fs.mkdirSync("./dashboard/public/docs"); fs.writeFileSync("./dashboard/public/docs/commands.md", text); client.logger.log("Dashboard docs updated!"); diff --git a/helpers/birthdays.js b/helpers/birthdays.js index a8fd0982..69a95685 100644 --- a/helpers/birthdays.js +++ b/helpers/birthdays.js @@ -1,5 +1,5 @@ -const CronJob = require("cron").CronJob, - Discord = require("discord.js"); +const { CronJob } = require("cron"), + { MessageEmbed } = require("discord.js"); module.exports.init = async function (client) { new CronJob("0 5 * * *", async function () { @@ -26,7 +26,7 @@ module.exports.init = async function (client) { const age = currentYear - year; if (currentMonth === month && currentDay === day) { - const embed = new Discord.MessageEmbed() + const embed = new MessageEmbed() .setAuthor({ name: client.user.username, iconURL: client.user.displayAvatarURL({ diff --git a/helpers/checkReminds.js b/helpers/checkReminds.js index 57e8351a..bdc111a7 100644 --- a/helpers/checkReminds.js +++ b/helpers/checkReminds.js @@ -1,4 +1,4 @@ -const Discord = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports.init = function (client) { client.usersData @@ -18,7 +18,7 @@ module.exports.init = function (client) { const mustSent = reminds.filter((r) => r.sendAt < dateNow); if (mustSent.length > 0) { mustSent.forEach((r) => { - const embed = new Discord.MessageEmbed() + const embed = new MessageEmbed() .setAuthor({ name: client.translate("general/remindme:TITLE") }) diff --git a/helpers/checkUnmutes.js b/helpers/checkUnmutes.js index afd8fc52..9fac0be0 100644 --- a/helpers/checkUnmutes.js +++ b/helpers/checkUnmutes.js @@ -1,4 +1,4 @@ -const Discord = require("discord.js"); +const { MessageEmbed } = require("discord.js"); module.exports.init = async function (client) { client.membersData @@ -33,7 +33,7 @@ module.exports.init = async function (client) { }); } const user = member ? member.user : await client.users.fetch(memberData.id); - const embed = new Discord.MessageEmbed() + const embed = new MessageEmbed() .setDescription(guild.translate("moderation/unmute:SUCCESS_CASE", { user: user.toString(), usertag: user.tag, diff --git a/helpers/extenders.js b/helpers/extenders.js index b61a4b2c..8e061c84 100644 --- a/helpers/extenders.js +++ b/helpers/extenders.js @@ -11,7 +11,7 @@ Message.prototype.replyT = function (key, args, options = {}) { let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; - if (options.edit) return this.edit(string); + if (options.edit) return this.edit({ content: string }); else return this.reply({ content: string }); }; @@ -38,8 +38,8 @@ Interaction.prototype.replyT = function (key, args, options = {}) { let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; - if (options.edit) return this.editReply(string); - else return this.reply({ content: string, ephemeral: options.ephemeral || false, fetchReply: options.fetchReply || false }); + if (options.edit) return this.editReply({ content: string, ephemeral: options.ephemeral || false }); + else return this.reply({ content: string, ephemeral: options.ephemeral || false }); }; Interaction.prototype.error = function (key, args, options = {}) { diff --git a/helpers/functions.js b/helpers/functions.js index 6d8781bf..54717c05 100644 --- a/helpers/functions.js +++ b/helpers/functions.js @@ -10,10 +10,7 @@ module.exports = { const member = guild.me; const channel = guild.channels.cache.find((ch) => ch.permissionsFor(member.id).has(Permissions.FLAGS.CREATE_INSTANT_INVITE) && ch.type === "GUILD_TEXT" || ch.type === "GUILD_VOICE"); if (channel) { - const invite = await channel.createInvite({ - maxAge: 0, - maxUses: 5 - }).catch(() => {}); + const invite = await channel.createInvite(); return invite ? invite.url : "No URL"; } return "No channels found for invite"; diff --git a/helpers/resolvers.js b/helpers/resolvers.js index a45dced8..aa7ba46c 100644 --- a/helpers/resolvers.js +++ b/helpers/resolvers.js @@ -1,80 +1,96 @@ -const resolveChannel = async ({ message, search, channelType }) => { - const contentToCheck = search || message.content; - if (!contentToCheck || typeof contentToCheck !== "string") return; +/** + * + * @param {import("discord.js").Guild} guild + * @param {String} search + * @param {String} channelType + * @returns + */ +const resolveChannel = async ({ guild, search, channelType }) => { + if (!search || typeof search !== "string") return; // Try by parsing the search - if (contentToCheck.match(/^<#([0-9]{18})>/)) { - const [, channelId] = contentToCheck.match(/^<#([0-9]{18})>/); - const channelFound = message.guild.channels.cache.get(channelId); + if (search.match(/^<#([0-9]{18})>/)) { + const [, channelId] = search.match(/^<#([0-9]{18})>/); + const channelFound = guild.channels.cache.get(channelId); if (channelFound && channelType && channelFound.type === channelType) return channelFound; } // Try with ID - if (message.guild.channels.cache.has(search)) { - const channelFound = message.guild.channels.cache.get(search); + if (guild.channels.cache.has(search)) { + const channelFound = guild.channels.cache.get(search); if (channelFound && channelType && channelFound.type === channelType) return channelFound; } // Try with name with # - if (message.guild.channels.cache.some(channel => `#${channel.name}` === search || channel.name === search)) { - const channelFound = message.guild.channels.cache.find(channel => `#${channel.name}` === search || channel.name === search); + if (guild.channels.cache.some(channel => `#${channel.name}` === search || channel.name === search)) { + const channelFound = guild.channels.cache.find(channel => `#${channel.name}` === search || channel.name === search); if (channelFound && channelType && channelFound.type === channelType) return channelFound; } return; }; -const resolveMember = async ({ message, search, useMessageContent = true }) => { - const contentToCheck = search || (useMessageContent ? message.content : null); - if (!contentToCheck || typeof contentToCheck !== "string") return; +/** + * + * @param {import("discord.js").Guild} guild + * @param {String} search + * @returns + */ +const resolveMember = async ({ guild, search }) => { + if (!search || typeof search !== "string") return; // Try by parsing the search - if (contentToCheck.match(/^<@!?(\d+)>$/)) { - const [, userId] = contentToCheck.match(/^<@!?(\d+)>$/); - const memberFound = await message.guild.members.fetch(userId).catch(() => {}); + if (search.match(/^<@!?(\d+)>$/)) { + const [, userId] = search.match(/^<@!?(\d+)>$/); + const memberFound = await guild.members.fetch(userId).catch(() => {}); if (memberFound) return memberFound; } // Try with ID - if (await message.guild.members.fetch(search).catch(() => {})) { - const memberFound = await message.guild.members.fetch(search); + if (await guild.members.fetch(search).catch(() => {})) { + const memberFound = await guild.members.fetch(search); if (memberFound) return memberFound; } // Try with name with @ - await message.guild.members.fetch({ + await guild.members.fetch({ query: search }); - if (message.guild.members.cache.some(member => member.user.tag === search || member.user.username === search)) { - const memberFound = message.guild.members.cache.find(member => member.user.tag === search || member.user.username === search); + if (guild.members.cache.some(member => member.user.tag === search || member.user.username === search)) { + const memberFound = guild.members.cache.find(member => member.user.tag === search || member.user.username === search); if (memberFound) return memberFound; } return; }; -const resolveRole = async ({ message, search }) => { - const contentToCheck = search || message.content; - if (!contentToCheck || typeof contentToCheck !== "string") return; +/** + * + * @param {import("discord.js").Guild} guild + * @param {String} search + * @returns + */ +const resolveRole = async ({ guild, search }) => { + if (!search || typeof search !== "string") return; // Try by parsing the search - if (contentToCheck.match(/^<@&([0-9]{18})>/)) { - const [, roleId] = contentToCheck.match(/^<@&([0-9]{18})>/); - const roleFound = message.guild.roles.cache.get(roleId); + if (search.match(/^<@&([0-9]{18})>/)) { + const [, roleId] = search.match(/^<@&([0-9]{18})>/); + const roleFound = guild.roles.cache.get(roleId); if (roleFound) return roleFound; } // Try with ID - if (message.guild.roles.cache.has(search)) { - const roleFound = message.guild.roles.cache.get(search); + if (guild.roles.cache.has(search)) { + const roleFound = guild.roles.cache.get(search); if (roleFound) return roleFound; } // Try with name with @ - if (message.guild.roles.cache.some(role => `@${role.name}` === search || role.name === search)) { - const roleFound = message.guild.roles.cache.find(role => `@${role.name}` === search || role.name === search); + if (guild.roles.cache.some(role => `@${role.name}` === search || role.name === search)) { + const roleFound = guild.roles.cache.find(role => `@${role.name}` === search || role.name === search); if (roleFound) return roleFound; } diff --git a/helpers/tictactoe.js b/helpers/tictactoe.js index 7b5e37ed..92ac9f1a 100644 --- a/helpers/tictactoe.js +++ b/helpers/tictactoe.js @@ -8,89 +8,83 @@ const { MessageEmbed, MessageButton, MessageActionRow } = require("discord.js"); */ /** slash => Boolean - userSlash => String - resultBtn => Boolean - embedFoot => String embedColor => HexColor timeoutEmbedColor => HexColor - xEmoji => (Emoji ID) String - oEmoji => (Emoji ID) String - idleEmoji => (Emoji ID) String */ -async function tictactoe(message, options = []) { +async function tictactoe(interaction, options = {}) { // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve) => { try { - const { client } = message; + const { client } = interaction; let opponent; - if (message.commandId) { - opponent = message.options.getUser(options.userSlash || "user"); + if (interaction.commandId) { + opponent = interaction.options.getUser(options.userSlash || "user"); if (!opponent) - return message.reply({ - content: message.translate("economy/tictactoe:NO_USER"), + return interaction.reply({ + content: interaction.translate("economy/tictactoe:NO_USER"), ephemeral: true }); if (opponent.bot) - return message.reply({ - content: message.translate("economy/tictactoe:BOT_USER"), + return interaction.reply({ + content: interaction.translate("economy/tictactoe:BOT_USER"), ephemeral: true }); - if (opponent.id == (message.user ? message.user : message.author).id) - return message.reply({ - content: message.translate("economy/tictactoe:YOURSELF"), + if (opponent.id == (interaction.user ? interaction.user : interaction.author).id) + return interaction.reply({ + content: interaction.translate("economy/tictactoe:YOURSELF"), ephemeral: true }); - } else if (!message.commandId) { - opponent = message.mentions.members.first()?.user; + } else if (!interaction.commandId) { + opponent = interaction.mentions.members.first()?.user; if (!opponent) - return message.reply({ - content: message.translate("economy/tictactoe:NO_USER") + return interaction.reply({ + content: interaction.translate("economy/tictactoe:NO_USER") }); if (opponent.bot) - return message.reply({ - content: message.translate("economy/tictactoe:BOT_USER"), + return interaction.reply({ + content: interaction.translate("economy/tictactoe:BOT_USER"), ephemeral: true }); - if (opponent.id === message.member.id) - return message.reply({ - content: message.translate("economy/tictactoe:YOURSELF") + if (opponent.id === interaction.member.id) + return interaction.reply({ + content: interaction.translate("economy/tictactoe:YOURSELF") }); } const foot = options.embedFoot ? { text: options.embedFoot } : { text: "Удачи =)" }; const acceptEmbed = new MessageEmbed() - .setTitle(message.translate("economy/tictactoe:REQUEST_WAIT", { + .setTitle(interaction.translate("economy/tictactoe:REQUEST_WAIT", { user: opponent.tag })) .setAuthor({ - name: (message.user ? message.user : message.author).tag, - iconURL: (message.user ? message.user : message.author).displayAvatarURL() + name: (interaction.user ? interaction.user : interaction.author).tag, + iconURL: (interaction.user ? interaction.user : interaction.author).displayAvatarURL() }) .setColor(options.embedColor || "#075FFF") .setFooter(foot) .setTimestamp(); const accept = new MessageButton() - .setLabel(message.translate("economy/tictactoe:ACCEPT")) + .setLabel(interaction.translate("economy/tictactoe:ACCEPT")) .setStyle("SUCCESS") .setCustomId("acceptttt"); const decline = new MessageButton() - .setLabel(message.translate("economy/tictactoe:DECLINE")) + .setLabel(interaction.translate("economy/tictactoe:DECLINE")) .setStyle("DANGER") .setCustomId("declinettt"); @@ -101,17 +95,17 @@ async function tictactoe(message, options = []) { let m; - if (message.commandId) { - m = await message.reply({ - content: message.translate("economy/tictactoe:INVITE_USER", { + if (interaction.commandId) { + m = await interaction.reply({ + content: interaction.translate("economy/tictactoe:INVITE_USER", { opponent: opponent.id }), embeds: [acceptEmbed], components: [accep] }); - } else if (!message.commandId) { - m = await message.reply({ - content: message.translate("economy/tictactoe:INVITE_USER", { + } else if (!interaction.commandId) { + m = await interaction.reply({ + content: interaction.translate("economy/tictactoe:INVITE_USER", { opponent: opponent.id }), embeds: [acceptEmbed], @@ -125,7 +119,7 @@ async function tictactoe(message, options = []) { collector.on("collect", async (button) => { if (button.user.id !== opponent.id) return button.reply({ - content: message.translate("economy/tictactoe:REQUEST_SEND", { + content: interaction.translate("economy/tictactoe:REQUEST_SEND", { opponent: opponent.id }), ephemeral: true @@ -136,10 +130,10 @@ async function tictactoe(message, options = []) { return collector.stop("decline"); } else if (button.customId == "acceptttt") { collector.stop(); - if (message.commandId) button.message.delete(); + if (interaction.commandId) button.message.delete(); const fighters = [ - (message.user ? message.user : message.author).id, + (interaction.user ? interaction.user : interaction.author).id, opponent.id ].sort(() => (Math.random() > 0.5 ? 1 : -1)); @@ -199,28 +193,28 @@ async function tictactoe(message, options = []) { const { MessageActionRow, MessageButton } = require("discord.js"); const epm = new MessageEmbed() - .setTitle(message.translate("economy/tictactoe:DESCRIPTION")) + .setTitle(interaction.translate("economy/tictactoe:DESCRIPTION")) .setColor(options.embedColor || "#075FFF") .setFooter(foot) .setTimestamp(); let msg; - if (message.commandId) { - msg = await message.reply({ + if (interaction.commandId) { + msg = await interaction.reply({ embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WAITING", { + interaction.translate("economy/tictactoe:WAITING", { user: Args.userid, emoji: client.emojis.cache.get(o_emoji) || "⭕" }) ) ] }); - } else if (!message.commandId) { + } else if (!interaction.commandId) { msg = await button.message.edit({ embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WAITING", { + interaction.translate("economy/tictactoe:WAITING", { user: Args.userid, emoji: client.emojis.cache.get(o_emoji) || "⭕" }) @@ -347,7 +341,7 @@ async function tictactoe(message, options = []) { if (options.resultBtn === true) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), @@ -355,7 +349,7 @@ async function tictactoe(message, options = []) { embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WON", { + interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" }) @@ -368,14 +362,14 @@ async function tictactoe(message, options = []) { else if (!options.resultBtn || options.resultBtn === false) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), embeds: [ epm.setDescription( - `${message.translate("economy/tictactoe:WON", { + `${interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" })}\n\`\`\`\n${Args.a1.emoji @@ -416,14 +410,14 @@ async function tictactoe(message, options = []) { if (options.resultBtn === true) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), components: buttons, embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WON", { + interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" }) @@ -436,14 +430,14 @@ async function tictactoe(message, options = []) { else if (!options.resultBtn || options.resultBtn === false) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), embeds: [ epm.setDescription( - `${message.translate("economy/tictactoe:WON", { + `${interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" })}\n\`\`\`\n${Args.a1.emoji @@ -535,14 +529,14 @@ async function tictactoe(message, options = []) { if (options.resultBtn === true) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), components: buttons, embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WON", { + interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" }) @@ -555,13 +549,13 @@ async function tictactoe(message, options = []) { else if (!options.resultBtn || options.resultBtn === false) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), embeds: [ epm.setDescription( - `${message.translate("economy/tictactoe:WON", { + `${interaction.translate("economy/tictactoe:WON", { winner: fighters[1], emoji: client.emojis.cache.get(o_emoji) || "⭕" })}\n\`\`\`\n${Args.a1.emoji @@ -602,14 +596,14 @@ async function tictactoe(message, options = []) { if (options.resultBtn === true) return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), components: buttons, embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WON", { + interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" }) @@ -622,13 +616,13 @@ async function tictactoe(message, options = []) { else return m .edit({ - content: message.translate("economy/tictactoe:WON", { + content: interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" }), embeds: [ epm.setDescription( - `${message.translate("economy/tictactoe:WON", { + `${interaction.translate("economy/tictactoe:WON", { winner: fighters[0], emoji: client.emojis.cache.get(o_emoji) || "⭕" })}\n\`\`\`\n${Args.a1.emoji @@ -667,7 +661,7 @@ async function tictactoe(message, options = []) { content: `<@${Args.userid}>`, embeds: [ epm.setDescription( - message.translate("economy/tictactoe:WAITING", { + interaction.translate("economy/tictactoe:WAITING", { user: Args.userid, emoji: Args.user == 0 ? `${client.emojis.cache.get(o_emoji) || "⭕"}` : `${client.emojis.cache.get(x_emoji) || "❌"}` }) @@ -685,7 +679,7 @@ async function tictactoe(message, options = []) { collector.on("collect", (b) => { if (b.user.id !== Args.userid) { b.reply({ - content: message.translate("economy/tictactoe:CANT_PLAY"), + content: interaction.translate("economy/tictactoe:CANT_PLAY"), ephemeral: true }); @@ -781,8 +775,8 @@ async function tictactoe(message, options = []) { if (options.resultBtn === true) return m .edit({ - content: message.translate("economy/tictactoe:TIE"), - embeds: [epm.setDescription(message.translate("economy/tictactoe:TIE_DESC"))] + content: interaction.translate("economy/tictactoe:TIE"), + embeds: [epm.setDescription(interaction.translate("economy/tictactoe:TIE_DESC"))] }) .then((m) => { m.react(dashmoji); @@ -790,10 +784,10 @@ async function tictactoe(message, options = []) { else return m .edit({ - content: message.translate("economy/tictactoe:TIE"), + content: interaction.translate("economy/tictactoe:TIE"), embeds: [ epm.setDescription( - `${message.translate("economy/tictactoe:TIE_DESC")}!\n\`\`\`\n${Args.a1.emoji + `${interaction.translate("economy/tictactoe:TIE_DESC")}!\n\`\`\`\n${Args.a1.emoji .replace(o_emoji, "⭕") .replace(x_emoji, "❌")} | ${Args.a2.emoji .replace(o_emoji, "⭕") @@ -832,7 +826,7 @@ async function tictactoe(message, options = []) { collector.on("end", (collected, reason) => { if (collected.size === 0 && reason == "time") m.edit({ - content: message.translate("economy/tictactoe:NO_ANSWER", { + content: interaction.translate("economy/tictactoe:NO_ANSWER", { user: Args.userid }), components: [] @@ -845,17 +839,17 @@ async function tictactoe(message, options = []) { collector.on("end", (collected, reason) => { if (reason == "time") { const embed = new MessageEmbed() - .setTitle(message.translate("economy/tictactoe:NO_ANSWER_TITLE")) + .setTitle(interaction.translate("economy/tictactoe:NO_ANSWER_TITLE")) .setAuthor({ - name: (message.user ? message.user : message.author).tag, - iconURL: (message.user ? message.user : message.author).displayAvatarURL() + name: (interaction.user ? interaction.user : interaction.author).tag, + iconURL: (interaction.user ? interaction.user : interaction.author).displayAvatarURL() }) .setColor(options.timeoutEmbedColor || "#C90000") .setFooter(foot) .setTimestamp() - .setDescription(message.translate("economy/tictactoe:TIMES_UP")); + .setDescription(interaction.translate("economy/tictactoe:TIMES_UP")); m.edit({ - content: message.translate("economy/tictactoe:NOT_ANSWERED", { + content: interaction.translate("economy/tictactoe:NOT_ANSWERED", { user: opponent.id }), embeds: [embed], @@ -864,15 +858,15 @@ async function tictactoe(message, options = []) { } if (reason == "decline") { const embed = new MessageEmbed() - .setTitle(message.translate("economy/tictactoe:CANCELED")) + .setTitle(interaction.translate("economy/tictactoe:CANCELED")) .setAuthor({ - name: (message.user ? message.user : message.author).tag, - iconURL: (message.user ? message.user : message.author).displayAvatarURL() + name: (interaction.user ? interaction.user : interaction.author).tag, + iconURL: (interaction.user ? interaction.user : interaction.author).displayAvatarURL() }) .setColor(options.timeoutEmbedColor || "#C90000") .setFooter(foot) .setTimestamp() - .setDescription(message.translate("economy/tictactoe:CANCELED_DESC", { + .setDescription(interaction.translate("economy/tictactoe:CANCELED_DESC", { user: opponent.id })); m.edit({ diff --git a/languages/en-US/images/brazzers.json b/languages/en-US/images/brazzers.json index 31347855..0ace455d 100644 --- a/languages/en-US/images/brazzers.json +++ b/languages/en-US/images/brazzers.json @@ -1,4 +1,4 @@ -{ +z{ "DESCRIPTION": "Generates a \"dictator\" image", "USAGE": "dictator (@member)", "EXAMPLES": "dictator\ndictator @Jonny_Bro#4226" diff --git a/languages/ru-RU/common.json b/languages/ru-RU/common.json index 5e29dc74..615024c2 100644 --- a/languages/ru-RU/common.json +++ b/languages/ru-RU/common.json @@ -37,7 +37,8 @@ "LINKS": "Ссылки", "CREDITS": "Кредиты", "LEVEL": "Уровень", - "POINTS": "Очки", + "REP": "Очки репутации", + "XP": "Опыт", "VICTORY": "Победа", "DEFEAT": "Поражение", "MODERATOR": "Модератор", diff --git a/languages/ru-RU/economy/leaderboard.json b/languages/ru-RU/economy/leaderboard.json index ac9902a2..8fb626a7 100644 --- a/languages/ru-RU/economy/leaderboard.json +++ b/languages/ru-RU/economy/leaderboard.json @@ -6,8 +6,5 @@ "MOBILE": ":confused: Я заметил, что вы онлайн с телефона... Таблица лидеров может отображаться некорректно на маленьких экранах. Попробуйте позже с другого устройства!", "TABLE": "Таблица лидеров {{name}}", "TOP": "Топ 20", - "LEVEL": "Уровень", - "XP": "Опыт", - "CREDITS": "Кредиты", - "REP": "Репутация" + "XP": "Опыт" } \ No newline at end of file diff --git a/languages/ru-RU/nsfw/nsfw.json b/languages/ru-RU/nsfw/nsfw.json index cd1208b5..711d8c6d 100644 --- a/languages/ru-RU/nsfw/nsfw.json +++ b/languages/ru-RU/nsfw/nsfw.json @@ -1,9 +1,8 @@ { - "DESCRIPTION": "Получить NSFW изображение с выбранного или случайного сабреддита", - "USAGE": "nsfw (тег/list)", - "EXAMPLES": "nsfw\nnsfw list", - "SEARCHING": "Ищу изображение по тегу `{{tag}}`", - "SEARCHING_RANDOM": "Ищу случайное изображение", - "EMBED_TITLE": "Доступные категории", - "NOT_FOUND": "Данной категории не существует!" + "DESCRIPTION": "Найти NSFW изображение по тэгу", + "USAGE": "nsfw", + "EXAMPLES": "nsfw", + "AVAILABLE_CATEGORIES": "Доступные категории:", + "NOTHING_SELECTED": "Ничего не выбрано", + "TAG": "Тэг" } \ No newline at end of file diff --git a/languages/ru-RU/owner/debug.json b/languages/ru-RU/owner/debug.json index 6cafafc7..06b88eea 100644 --- a/languages/ru-RU/owner/debug.json +++ b/languages/ru-RU/owner/debug.json @@ -1,12 +1,13 @@ { - "DESCRIPTION": "Позволяет изменять многие данные пользователя!", - "USAGE": "debug [set/add] [level/xp/credits/bank/rep] [@пользователь] [значение]", + "DESCRIPTION": "Позволяет изменять многие данные пользователя", + "USAGE": "[действие] [тип] [@пользователь] [значение]", "EXAMPLES": "debug set level @Jonny_Bro#4226 10000", - "INVALID_MEMBER": "Вы должны упомянуть пользователя!", - "NO_ACTION": "Выберите действие: `set` или `add`!", - "NO_STATUS": "Выберите параметр: `level`, `xp`, `credits`, `rep` или `bank`!", - "BOT_USER": "Вы не можете изменить статистику бота!", - "INVALID_AMOUNT": "Укажите новое значение!", + "TYPE": "Тип данных", + "SET": "Установить значение", + "ADD": "Добавить к значению", + "TARGET": "Пользователь", + "INT": "Целое число", + "BOT": "Вы не можете изменить статистику бота!", "SUCCESS_LEVEL": "Уровень пользователя **{{username}}** изменён на **{{amount}}**!", "SUCCESS_XP": "XP пользователя **{{username}}** изменён на **{{amount}}**!", "SUCCESS_CREDITS": "Кредиты пользователя **{{username}}** изменены на **{{amount}}**!", diff --git a/languages/ru-RU/owner/eval.json b/languages/ru-RU/owner/eval.json index afb63f84..42dd44a8 100644 --- a/languages/ru-RU/owner/eval.json +++ b/languages/ru-RU/owner/eval.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Выполнить код!", + "DESCRIPTION": "Выполнить код", "USAGE": "[код]", "EXAMPLES": "eval interaction.channel.send({ content: \"Hello World!\" })" } \ No newline at end of file diff --git a/languages/ru-RU/owner/say.json b/languages/ru-RU/owner/say.json index ea1e7cfa..05b5fa0e 100644 --- a/languages/ru-RU/owner/say.json +++ b/languages/ru-RU/owner/say.json @@ -1,5 +1,8 @@ { - "DESCRIPTION": "Написать сообщение от имени бота!", - "USAGE": "say [текст] ++ (ID/название-канала) ++ (ID/название-сервера)", - "EXAMPLES": "say Hello World!\nsay Hello World! ++ 123456789098765432" + "DESCRIPTION": "Написать сообщение от имени бота", + "USAGE": "[текст] (#канал)", + "EXAMPLES": "say Hello World!\nsay Hello World! #новости", + "DONE": "Сообщение `{{message}}` отправлено в {{channel}}!", + "MESSAGE": "Сообщение", + "CHANNEL": "Канал" } \ No newline at end of file diff --git a/languages/ru-RU/owner/servers-list.json b/languages/ru-RU/owner/servers.json similarity index 50% rename from languages/ru-RU/owner/servers-list.json rename to languages/ru-RU/owner/servers.json index 69a81a32..ac4e7df8 100644 --- a/languages/ru-RU/owner/servers-list.json +++ b/languages/ru-RU/owner/servers.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать список серверов бота!", - "USAGE": "servers-list", - "EXAMPLES": "servers-list" + "DESCRIPTION": "Показать список серверов бота", + "USAGE": "servers", + "EXAMPLES": "servers" } \ No newline at end of file From d7b279020048535dd9315bf2cf6c777966c3d0cb Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Sun, 31 Jul 2022 17:08:00 +0500 Subject: [PATCH 07/16] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=20=D0=BD=D0=B0=20discord.js=2014=20=D0=A4=D0=B8=D0=BA?= =?UTF-8?q?=D1=81=D1=8B=20=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=81=D1=82=D0=B0=D1=80=D1=8B=D1=85=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=20=D0=BA=20d.js=2014?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/Administration/backup.js | 145 --- TO REWRITE/Administration/configuration.js | 129 +-- TO REWRITE/Administration/stealemoji.js | 4 +- TO REWRITE/Economy/achievements.js | 95 +- TO REWRITE/Economy/leaderboard.js | 18 +- TO REWRITE/Economy/money.js | 23 +- TO REWRITE/Economy/profile.js | 78 +- TO REWRITE/Economy/transactions.js | 19 +- TO REWRITE/Economy/work.js | 39 +- TO REWRITE/Examples/mention.js | 7 +- TO REWRITE/Examples/ping.js | 35 - TO REWRITE/Examples/repeat.js | 9 +- TO REWRITE/Fun/8ball.js | 31 - TO REWRITE/Fun/ascii.js | 34 - TO REWRITE/Fun/flip.js | 25 - TO REWRITE/Fun/lmg.js | 30 - TO REWRITE/Fun/lovecalc.js | 59 -- TO REWRITE/Fun/memes.js | 78 -- TO REWRITE/General/activity.js | 30 +- TO REWRITE/General/avatar.js | 1 - TO REWRITE/General/emoji.js | 23 +- TO REWRITE/General/help.js | 64 +- TO REWRITE/General/invite.js | 55 - TO REWRITE/General/invites.js | 72 -- TO REWRITE/General/minecraft.js | 32 +- TO REWRITE/General/permissions.js | 50 - TO REWRITE/General/quote.js | 88 -- TO REWRITE/General/report.js | 35 +- TO REWRITE/General/serverinfo.js | 76 +- TO REWRITE/General/shorturl.js | 2 +- TO REWRITE/General/staff.js | 20 +- TO REWRITE/General/stats.js | 77 +- TO REWRITE/General/suggest.js | 28 +- TO REWRITE/General/translate.js | 72 -- TO REWRITE/General/userinfo.js | 103 +- TO REWRITE/General/whois.js | 20 +- TO REWRITE/Moderation/announcement.js | 2 +- TO REWRITE/Moderation/ban.js | 112 -- TO REWRITE/Moderation/kick.js | 100 -- TO REWRITE/Moderation/mute.js | 113 -- TO REWRITE/Moderation/poll.js | 15 +- TO REWRITE/Moderation/unmute.js | 47 - TO REWRITE/Moderation/untimeout.js | 60 ++ TO REWRITE/Moderation/warn.js | 20 +- .../Moderation/{sanctions.js => warns.js} | 11 +- TO REWRITE/Music/back.js | 2 +- TO REWRITE/Music/clips.js | 2 +- TO REWRITE/Music/jump.js | 2 +- TO REWRITE/Music/np.js | 32 +- TO REWRITE/Music/play.js | 4 +- TO REWRITE/Music/queue.js | 26 +- TO REWRITE/Music/skip.js | 2 +- TO REWRITE/Music/stop.js | 2 +- base/BaseCommand.js | 2 +- base/JaBa.js | 17 +- commands/Fun/8ball.js | 53 + commands/Fun/lmgtfy.js | 47 + commands/Fun/lovecalc.js | 74 ++ commands/Fun/memes.js | 81 ++ commands/General/ping.js | 2 +- commands/NSFW/nsfw.js | 20 +- commands/Owner/debug.js | 2 +- commands/Owner/eval.js | 4 +- commands/Owner/reload.js | 6 +- commands/Owner/say.js | 4 +- commands/Owner/servers.js | 6 +- dashboard/routes/discord.js | 2 +- dashboard/utils.js | 6 +- events/CommandHandler.js | 3 +- events/Guild/guildCreate.js | 10 +- events/Guild/guildDelete.js | 8 +- events/Guild/guildMemberAdd.js | 4 +- events/Guild/guildMemberRemove.js | 4 +- events/messageCreate.js | 4 +- events/ready.js | 5 +- helpers/birthdays.js | 20 +- helpers/checkReminds.js | 20 +- helpers/checkUnmutes.js | 4 +- helpers/extenders.js | 56 +- helpers/functions.js | 6 +- helpers/tictactoe.js | 64 +- index.js | 6 +- languages/ru-RU/administration/backup.json | 20 - languages/ru-RU/common.json | 6 +- languages/ru-RU/fun/8ball.json | 6 +- languages/ru-RU/fun/flip.json | 7 - languages/ru-RU/fun/{lmg.json => lmgtfy.json} | 4 +- languages/ru-RU/fun/lovecalc.json | 3 +- languages/ru-RU/fun/memes.json | 2 +- languages/ru-RU/general/invite.json | 10 - languages/ru-RU/general/invites.json | 13 - languages/ru-RU/general/translate.json | 9 - languages/ru-RU/misc.json | 46 - languages/ru-RU/moderation/ban.json | 13 - languages/ru-RU/moderation/kick.json | 11 - languages/ru-RU/moderation/mute.json | 10 - languages/ru-RU/moderation/unmute.json | 9 - languages/ru-RU/nsfw/nsfw.json | 2 - languages/ru-RU/owner/eval.json | 2 +- languages/ru-RU/owner/reload.json | 2 +- languages/uk-UA/misc.json | 45 - package-lock.json | 964 +++++++----------- package.json | 26 +- scripts/verify-config.js | 4 +- 104 files changed, 1571 insertions(+), 2441 deletions(-) delete mode 100644 TO REWRITE/Administration/backup.js delete mode 100644 TO REWRITE/Examples/ping.js delete mode 100644 TO REWRITE/Fun/8ball.js delete mode 100644 TO REWRITE/Fun/ascii.js delete mode 100644 TO REWRITE/Fun/flip.js delete mode 100644 TO REWRITE/Fun/lmg.js delete mode 100644 TO REWRITE/Fun/lovecalc.js delete mode 100644 TO REWRITE/Fun/memes.js delete mode 100644 TO REWRITE/General/invite.js delete mode 100644 TO REWRITE/General/invites.js delete mode 100644 TO REWRITE/General/permissions.js delete mode 100644 TO REWRITE/General/quote.js delete mode 100644 TO REWRITE/General/translate.js delete mode 100644 TO REWRITE/Moderation/ban.js delete mode 100644 TO REWRITE/Moderation/kick.js delete mode 100644 TO REWRITE/Moderation/mute.js delete mode 100644 TO REWRITE/Moderation/unmute.js create mode 100644 TO REWRITE/Moderation/untimeout.js rename TO REWRITE/Moderation/{sanctions.js => warns.js} (81%) create mode 100644 commands/Fun/8ball.js create mode 100644 commands/Fun/lmgtfy.js create mode 100644 commands/Fun/lovecalc.js create mode 100644 commands/Fun/memes.js delete mode 100644 languages/ru-RU/administration/backup.json delete mode 100644 languages/ru-RU/fun/flip.json rename languages/ru-RU/fun/{lmg.json => lmgtfy.json} (61%) delete mode 100644 languages/ru-RU/general/invite.json delete mode 100644 languages/ru-RU/general/invites.json delete mode 100644 languages/ru-RU/general/translate.json delete mode 100644 languages/ru-RU/moderation/ban.json delete mode 100644 languages/ru-RU/moderation/kick.json delete mode 100644 languages/ru-RU/moderation/mute.json delete mode 100644 languages/ru-RU/moderation/unmute.json diff --git a/TO REWRITE/Administration/backup.js b/TO REWRITE/Administration/backup.js deleted file mode 100644 index 27e034e2..00000000 --- a/TO REWRITE/Administration/backup.js +++ /dev/null @@ -1,145 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - backup = require("discord-backup"); - -backup.setStorageFolder(__dirname + "/../../backups"); - -class Backup extends Command { - constructor(client) { - super(client, { - name: "backup", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ba"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ADMINISTRATOR"], - nsfw: false, - ownerOnly: false, - cooldown: 20000 - }); - } - - async run(message, args, data) { - const status = args[0]; - if (!status) return message.error("administration/backup:MISSING_STATUS"); - - if (status === "create") { - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - backup.create(message.guild).then((backup) => { - m.delete(); - - message.success("administration/backup:SUCCESS_PUBLIC"); - message.author.send(message.translate("administration/backup:SUCCESS_PRIVATE", { - backupID: backup.id - })).catch(() => { - backup.remove(backup.id); - message.error("misc:CANNOT_DM"); - }); - }).catch((err) => { - console.error(err); - return message.error("misc:ERR_OCCURRED"); - }); - } else if (status === "load") { - const backupID = args[1]; - if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); - - backup.fetch(backupID).then(async () => { - message.sendT("administration/backup:CONFIRMATION"); - - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ - filter, - time: 20000 - }); - - collector.on("collect", async msg => { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - message.author.send(message.translate("administration/backup:START_LOADING")); - - backup.load(backupID, message.guild).then(() => { - backup.remove(backupID); - message.author.send(message.translate("administration/backup:LOAD_SUCCESS")); - collector.stop(); - }).catch((err) => { - console.error(err); - return message.error("misc:ERR_OCCURRED"); - }); - } - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - }).catch((err) => { - console.error(err); - return message.error("administration/backup:NO_BACKUP_FOUND", { - backupID - }); - }); - } else if (status === "info") { - const backupID = args[1]; - if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); - - backup.fetch(backupID).then(async (backupInfo) => { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("administration/backup:TITLE_INFO") - }) - .addField(message.translate("administration/backup:TITLE_ID"), backupInfo.id, true) - .addField(message.translate("administration/backup:TITLE_SERVER_ID"), backupInfo.data.guildID.toString(), true) - .addField(message.translate("administration/backup:TITLE_SIZE"), `${backupInfo.size} kb`, true) - .addField(message.translate("administration/backup:TITLE_CREATED_AT"), this.client.printDate(new Date(backupInfo.data.createdTimestamp)), true) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - message.reply({ - embeds: [embed] - }); - }).catch((err) => { - console.error(err); - return message.error("administration/backup:NO_BACKUP_FOUND", { - backupID - }); - }); - } else if (status === "remove") { - const backupID = args[1]; - if (!backupID) return message.error("administration/backup:MISSING_BACKUP_ID"); - - backup.fetch(backupID).then(async () => { - message.sendT("administration/backup:REMOVE_CONFIRMATION"); - - const filter = m => m.author.id === message.author.id; - const collector = message.channel.createMessageCollector({ - filter, - time: 20000 - }); - - collector.on("collect", async msg => { - if (msg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - backup.remove(backupID).then(async () => { - message.success("administration/backup:SUCCESS_REMOVED"); - }); - collector.stop(); - } - }); - - collector.on("end", (_, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - }).catch((err) => { - console.error(err); - return message.error("administration/backup:NO_BACKUP_FOUND", { - backupID - }); - }); - } else { - return message.error("administration/backup:MISSING_STATUS"); - } - } -} - -module.exports = Backup; \ No newline at end of file diff --git a/TO REWRITE/Administration/configuration.js b/TO REWRITE/Administration/configuration.js index e6d75ef2..2359a58f 100644 --- a/TO REWRITE/Administration/configuration.js +++ b/TO REWRITE/Administration/configuration.js @@ -20,74 +20,83 @@ class Configuration extends Command { async run(message, args, data) { const guildData = data.guild; - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.guild.name, - iconURL: message.guild.iconURL({ - dynamic: true - }) + iconURL: message.guild.iconURL() }) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer }); - // Guild prefix - embed.addField(message.translate("administration/configuration:PREFIX_TITLE"), guildData.prefix); - - // Ignored channels - embed.addField(message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"), guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS")); - - // Autorole plugin - embed.addField(message.translate("administration/configuration:AUTOROLE_TITLE"), guildData.plugins.autorole.enabled ? message.translate("administration/configuration:AUTOROLE_CONTENT", { - roleName: `<@&${guildData.plugins.autorole.role}>` - }) : message.translate("administration/configuration:AUTOROLE_DISABLED")); - - // Welcome plugin - embed.addField(message.translate("administration/configuration:WELCOME_TITLE"), guildData.plugins.welcome.enabled ? message.translate("administration/configuration:WELCOME_CONTENT", { - channel: `<#${guildData.plugins.welcome.channel}>`, - withImage: guildData.plugins.welcome.withImage ? message.translate("common:YES") : message.translate("common:NO") - }) : message.translate("administration/configuration:WELCOME_DISABLED")); - - // Goodbye plugin - embed.addField(message.translate("administration/configuration:GOODBYE_TITLE"), guildData.plugins.goodbye.enabled ? message.translate("administration/configuration:GOODBYE_CONTENT", { - channel: `<#${guildData.plugins.goodbye.channel}>`, - withImage: guildData.plugins.goodbye.withImage ? message.translate("common:YES") : message.translate("common:NO") - }) : message.translate("administration/configuration:GOODBYE_DISABLED")); - - // Special channels - embed.addField(message.translate("administration/configuration:SPECIAL_CHANNELS"), - message.translate("administration/configuration:SUGGESTIONS", { - channel: guildData.plugins.suggestions ? `<#${guildData.plugins.suggestions}>` : message.translate("common:NOT_DEFINED") - }) + "\n" + - message.translate("administration/configuration:REPORTS", { - channel: guildData.plugins.reports ? `<#${guildData.plugins.reports}>` : message.translate("common:NOT_DEFINED") - }) + "\n" + - message.translate("administration/configuration:MODLOGS", { - channel: guildData.plugins.modlogs ? `<#${guildData.plugins.modlogs}>` : message.translate("common:NOT_DEFINED") - }) + "\n" + - message.translate("administration/configuration:BIRTHDAYS", { - channel: guildData.plugins.birthdays ? `<#${guildData.plugins.birthdays}>` : message.translate("common:NOT_DEFINED") - }) - ); - - // Auto sanctions - embed.addField(message.translate("administration/configuration:AUTO_SANCTIONS"), (guildData.plugins.warnsSanctions.kick ? message.translate("administration/configuration:KICK_CONTENT", { - count: guildData.plugins.warnsSanctions.kick - }) : message.translate("administration/configuration:KICK_NOT_DEFINED")) + "\n" + (guildData.plugins.warnsSanctions.ban ? message.translate("administration/configuration:BAN_CONTENT", { - count: guildData.plugins.warnsSanctions.ban - }) : message.translate("administration/configuration:BAN_NOT_DEFINED"))); - - // Automod plugin - embed.addField(message.translate("administration/configuration:AUTOMOD_TITLE"), guildData.plugins.automod.enabled ? message.translate("administration/configuration:AUTOMOD_CONTENT", { - channels: guildData.plugins.automod.ignored.map((ch) => `<#${ch}>`) - }) : message.translate("administration/configuration:AUTOMOD_DISABLED")); - - // Auto-delete mod commands - embed.addField(message.translate("administration/configuration:AUTODELETEMOD"), guildData.autoDeleteModCommands ? message.translate("administration/configuration:AUTODELETEMOD_ENABLED") : message.translate("administration/configuration:AUTODELETEMOD_DISABLED")); - - // Dashboard link - embed.addField(message.translate("administration/configuration:DASHBOARD_TITLE"), `[${message.translate("administration/configuration:DASHBOARD_CONTENT")}](${data.config.dashboard.baseURL})`); + embed.addFields([ + { // Guild prefix + name: message.translate("administration/configuration:PREFIX_TITLE"), + value: guildData.prefix + }, + { // Ignored channels + name: message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"), + value: guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS") + }, + { // Autorole plugin + name: message.translate("administration/configuration:AUTOROLE_TITLE"), + value: guildData.plugins.autorole.enabled ? message.translate("administration/configuration:AUTOROLE_CONTENT", { + roleName: `<@&${guildData.plugins.autorole.role}>` + }) : message.translate("administration/configuration:AUTOROLE_DISABLED") + }, + { // Welcome plugin + name: message.translate("administration/configuration:WELCOME_TITLE"), + value: guildData.plugins.welcome.enabled ? message.translate("administration/configuration:WELCOME_CONTENT", { + channel: `<#${guildData.plugins.welcome.channel}>`, + withImage: guildData.plugins.welcome.withImage ? message.translate("common:YES") : message.translate("common:NO") + }) : message.translate("administration/configuration:WELCOME_DISABLED") + }, + { // Goodbye plugin + name: message.translate("administration/configuration:GOODBYE_TITLE"), + value: guildData.plugins.goodbye.enabled ? message.translate("administration/configuration:GOODBYE_CONTENT", { + channel: `<#${guildData.plugins.goodbye.channel}>`, + withImage: guildData.plugins.goodbye.withImage ? message.translate("common:YES") : message.translate("common:NO") + }) : message.translate("administration/configuration:GOODBYE_DISABLED") + }, + { // Special channels + name: message.translate("administration/configuration:SPECIAL_CHANNELS"), + value: message.translate("administration/configuration:SUGGESTIONS", { + channel: guildData.plugins.suggestions ? `<#${guildData.plugins.suggestions}>` : message.translate("common:NOT_DEFINED") + }) + "\n" + + message.translate("administration/configuration:REPORTS", { + channel: guildData.plugins.reports ? `<#${guildData.plugins.reports}>` : message.translate("common:NOT_DEFINED") + }) + "\n" + + message.translate("administration/configuration:MODLOGS", { + channel: guildData.plugins.modlogs ? `<#${guildData.plugins.modlogs}>` : message.translate("common:NOT_DEFINED") + }) + "\n" + + message.translate("administration/configuration:BIRTHDAYS", { + channel: guildData.plugins.birthdays ? `<#${guildData.plugins.birthdays}>` : message.translate("common:NOT_DEFINED") + }) + }, + { // Auto sanctions + name: message.translate("administration/configuration:AUTO_SANCTIONS"), + value: (guildData.plugins.warnsSanctions.kick ? message.translate("administration/configuration:KICK_CONTENT", { + count: guildData.plugins.warnsSanctions.kick + }) : message.translate("administration/configuration:KICK_NOT_DEFINED")) + "\n" + (guildData.plugins.warnsSanctions.ban ? message.translate("administration/configuration:BAN_CONTENT", { + count: guildData.plugins.warnsSanctions.ban + }) : message.translate("administration/configuration:BAN_NOT_DEFINED")) + }, + { // Automod plugin + name: message.translate("administration/configuration:AUTOMOD_TITLE"), + value: guildData.plugins.automod.enabled ? message.translate("administration/configuration:AUTOMOD_CONTENT", { + channels: guildData.plugins.automod.ignored.map((ch) => `<#${ch}>`) + }) : message.translate("administration/configuration:AUTOMOD_DISABLED") + }, + { // Auto-delete mod commands + name: message.translate("administration/configuration:AUTODELETEMOD"), + value: guildData.autoDeleteModCommands ? message.translate("administration/configuration:AUTODELETEMOD_ENABLED") : message.translate("administration/configuration:AUTODELETEMOD_DISABLED") + }, + { // Dashboard link + name: message.translate("administration/configuration:DASHBOARD_TITLE"), + value: `[${message.translate("administration/configuration:DASHBOARD_CONTENT")}](${data.config.dashboard.baseURL})` + } + ]); message.reply({ embeds: [embed] diff --git a/TO REWRITE/Administration/stealemoji.js b/TO REWRITE/Administration/stealemoji.js index 7c7d3709..bef0eff4 100644 --- a/TO REWRITE/Administration/stealemoji.js +++ b/TO REWRITE/Administration/stealemoji.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - { Util } = require("discord.js"); + { parseEmoji } = require("discord.js"); class Stealemoji extends Command { constructor(client) { @@ -21,7 +21,7 @@ class Stealemoji extends Command { if (!args.length) return message.error("administration/stealemoji:MISSING_EMOJI"); for (const rawEmoji of args) { - const parsedEmoji = Util.parseEmoji(rawEmoji); + const parsedEmoji = parseEmoji(rawEmoji); const extension = parsedEmoji.animated ? "gif" : "png"; message.guild.emojis diff --git a/TO REWRITE/Economy/achievements.js b/TO REWRITE/Economy/achievements.js index ea8c6180..1ba6ba0b 100644 --- a/TO REWRITE/Economy/achievements.js +++ b/TO REWRITE/Economy/achievements.js @@ -26,7 +26,7 @@ class Achievements extends Command { id: member.id })); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/achievements:TITLE") }) @@ -35,41 +35,64 @@ class Achievements extends Command { text: data.config.embed.footer }); - embed.addField(message.translate("economy/achievements:SEND_CMD"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.firstCommand.progress.now, - total: userData.achievements.firstCommand.progress.total, - percent: Math.round(100 * (userData.achievements.firstCommand.progress.now / userData.achievements.firstCommand.progress.total)) - })); - embed.addField(message.translate("economy/achievements:CLAIM_SALARY"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.work.progress.now, - total: userData.achievements.work.progress.total, - percent: Math.round(100 * (userData.achievements.work.progress.now / userData.achievements.work.progress.total)) - })); - embed.addField(message.translate("economy/achievements:MARRY"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.married.progress.now, - total: userData.achievements.married.progress.total, - percent: Math.round(100 * (userData.achievements.married.progress.now / userData.achievements.married.progress.total)) - })); - embed.addField(message.translate("economy/achievements:SLOTS"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.slots.progress.now, - total: userData.achievements.slots.progress.total, - percent: Math.round(100 * (userData.achievements.slots.progress.now / userData.achievements.slots.progress.total)) - })); - embed.addField(message.translate("economy/achievements:TIP"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.tip.progress.now, - total: userData.achievements.tip.progress.total, - percent: Math.round(100 * (userData.achievements.tip.progress.now / userData.achievements.tip.progress.total)) - })); - embed.addField(message.translate("economy/achievements:REP"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.rep.progress.now, - total: userData.achievements.rep.progress.total, - percent: Math.round(100 * (userData.achievements.rep.progress.now / userData.achievements.rep.progress.total)) - })); - embed.addField(message.translate("economy/achievements:INVITE"), message.translate("economy/achievements:PROGRESS", { - now: userData.achievements.invite.progress.now, - total: userData.achievements.invite.progress.total, - percent: Math.round(100 * (userData.achievements.invite.progress.now / userData.achievements.invite.progress.total)) - })); + embed.addFields([ + { + name: message.translate("economy/achievements:SEND_CMD"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.firstCommand.progress.now, + total: userData.achievements.firstCommand.progress.total, + percent: Math.round(100 * (userData.achievements.firstCommand.progress.now / userData.achievements.firstCommand.progress.total)) + }) + }, + { + name: message.translate("economy/achievements:CLAIM_SALARY"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.work.progress.now, + total: userData.achievements.work.progress.total, + percent: Math.round(100 * (userData.achievements.work.progress.now / userData.achievements.work.progress.total)) + }) + }, + { + name: message.translate("economy/achievements:MARRY"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.married.progress.now, + total: userData.achievements.married.progress.total, + percent: Math.round(100 * (userData.achievements.married.progress.now / userData.achievements.married.progress.total)) + }) + }, + { + name: message.translate("economy/achievements:SLOTS"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.slots.progress.now, + total: userData.achievements.slots.progress.total, + percent: Math.round(100 * (userData.achievements.slots.progress.now / userData.achievements.slots.progress.total)) + }) + }, + { + name: message.translate("economy/achievements:TIP"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.tip.progress.now, + total: userData.achievements.tip.progress.total, + percent: Math.round(100 * (userData.achievements.tip.progress.now / userData.achievements.tip.progress.total)) + }) + }, + { + name: message.translate("economy/achievements:REP"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.rep.progress.now, + total: userData.achievements.rep.progress.total, + percent: Math.round(100 * (userData.achievements.rep.progress.now / userData.achievements.rep.progress.total)) + }) + }, + { + name: message.translate("economy/achievements:INVITE"), + value: message.translate("economy/achievements:PROGRESS", { + now: userData.achievements.invite.progress.now, + total: userData.achievements.invite.progress.total, + percent: Math.round(100 * (userData.achievements.invite.progress.now / userData.achievements.invite.progress.total)) + }) + } + ]); message.reply({ embeds: [embed] diff --git a/TO REWRITE/Economy/leaderboard.js b/TO REWRITE/Economy/leaderboard.js index 627184bd..86a4e59c 100644 --- a/TO REWRITE/Economy/leaderboard.js +++ b/TO REWRITE/Economy/leaderboard.js @@ -45,14 +45,12 @@ class Leaderboard extends Command { money += `${data.money}\n`; } - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/leaderboard:TABLE", { name: message.guild.name }), - iconURL: message.guild.iconURL({ - dynamic: true - }) + iconURL: message.guild.iconURL() }) .setColor(data.config.embed.color) .addFields({ @@ -93,14 +91,12 @@ class Leaderboard extends Command { xp += `${data.xp} / ${5 * (data.level * data.level) + 80 * data.level + 100}\n`; } - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/leaderboard:TABLE", { name: message.guild.name }), - iconURL: message.guild.iconURL({ - dynamic: true - }) + iconURL: message.guild.iconURL() }) .setColor(data.config.embed.color) .addFields({ @@ -142,14 +138,12 @@ class Leaderboard extends Command { rep += `${data.rep}\n`; } - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/leaderboard:TABLE", { name: message.guild.name }), - iconURL: message.guild.iconURL({ - dynamic: true - }) + iconURL: message.guild.iconURL() }) .setColor(data.config.embed.color) .addFields({ diff --git a/TO REWRITE/Economy/money.js b/TO REWRITE/Economy/money.js index d173f229..b9c3b3bb 100644 --- a/TO REWRITE/Economy/money.js +++ b/TO REWRITE/Economy/money.js @@ -48,20 +48,33 @@ class Money extends Command { globalMoney += data.bankSold; }); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/money:TITLE", { username: member.user.username }), iconURL: member.user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) - .addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) + .addFields([ + { + name: message.translate("economy/profile:CASH"), + value: `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + inline: true + }, + { + name: message.translate("economy/profile:BANK"), + value: `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + inline: true + }, + { + name: message.translate("economy/profile:GLOBAL"), + value: `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + inline: true + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer diff --git a/TO REWRITE/Economy/profile.js b/TO REWRITE/Economy/profile.js index 45e564b1..3600f108 100644 --- a/TO REWRITE/Economy/profile.js +++ b/TO REWRITE/Economy/profile.js @@ -51,32 +51,78 @@ class Profile extends Command { globalMoney += data.bankSold; }); - const profileEmbed = new Discord.MessageEmbed() + const profileEmbed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/profile:TITLE", { username: member.user.tag }), iconURL: member.user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) .setImage("attachment://achievements.png") - .addField(this.client.customEmojis.link + " " + message.translate("economy/profile:LINK"), `[${message.translate("economy/profile:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/user/${member.user.id}/${message.guild.id})`) - .addField(message.translate("economy/profile:BIO"), userData.bio ? userData.bio : message.translate("economy/profile:NO_BIO")) - .addField(message.translate("economy/profile:CASH"), `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:BANK"), `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:GLOBAL"), `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, true) - .addField(message.translate("economy/profile:REPUTATION"), `**${userData.rep}** ${message.getNoun(userData.rep, message.translate("misc:NOUNS:POINTS:1"), message.translate("misc:NOUNS:POINTS:2"), message.translate("misc:NOUNS:POINTS:5"))}`, true) - .addField(message.translate("economy/profile:LEVEL"), `**${memberData.level}**`, true) - .addField(message.translate("economy/profile:EXP"), `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`, true) - .addField(message.translate("economy/profile:REGISTERED"), this.client.printDate(new Date(memberData.registeredAt)), true) - .addField(message.translate("economy/profile:BIRTHDATE"), (!userData.birthdate ? message.translate("economy/profile:NO_BIRTHDATE") : this.client.printDate(new Date(userData.birthdate))), true) - .addField(message.translate("economy/profile:LOVER"), (!userData.lover ? message.translate("economy/profile:NO_LOVER") : this.client.users.cache.get(userData.lover).tag), true) - .addField(message.translate("economy/profile:ACHIEVEMENTS"), message.translate("economy/profile:ACHIEVEMENTS_CONTENT", { - prefix: data.guild.prefix - })) + .addFields([ + { + name: this.client.customEmojis.link + " " + message.translate("economy/profile:LINK"), + value: `[${message.translate("economy/profile:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/user/${member.user.id}/${message.guild.id})` + }, + { + name: message.translate("economy/profile:BIO"), + value: userData.bio ? userData.bio : message.translate("economy/profile:NO_BIO") + }, + { + name: message.translate("economy/profile:CASH"), + value: `**${memberData.money}** ${message.getNoun(memberData.money, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + inline: true + }, + { + name: message.translate("economy/profile:BANK"), + value: `**${memberData.bankSold}** ${message.getNoun(memberData.bankSold, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + inline: true + }, + { + name: message.translate("economy/profile:GLOBAL"), + value: `**${globalMoney}** ${message.getNoun(globalMoney, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}`, + inline: true + }, + { + name: message.translate("economy/profile:REPUTATION"), + value: `**${userData.rep}** ${message.getNoun(userData.rep, message.translate("misc:NOUNS:POINTS:1"), message.translate("misc:NOUNS:POINTS:2"), message.translate("misc:NOUNS:POINTS:5"))}`, + inline: true + }, + { + name: message.translate("economy/profile:LEVEL"), + value:`**${memberData.level}**`, + inline: true + }, + { + name: message.translate("economy/profile:EXP"), + value: `**${memberData.exp}/${5 * (memberData.level * memberData.level) + 80 * memberData.level + 100}** xp`, + inline: true + }, + { + name: message.translate("economy/profile:REGISTERED"), + value: this.client.printDate(new Date(memberData.registeredAt)), + inline: true + }, + { + name: message.translate("economy/profile:BIRTHDATE"), + value: (!userData.birthdate ? message.translate("economy/profile:NO_BIRTHDATE") : this.client.printDate(new Date(userData.birthdate))), + inline: true + }, + { + name: message.translate("economy/profile:LOVER"), + value: (!userData.lover ? message.translate("economy/profile:NO_LOVER") : this.client.users.cache.get(userData.lover).tag), + inline: true + }, + { + name: message.translate("economy/profile:ACHIEVEMENTS"), + value: message.translate("economy/profile:ACHIEVEMENTS_CONTENT", { + prefix: data.guild.prefix + }) + } + ]) .setColor(data.config.embed.color) // Sets the color of the embed .setFooter({ text: data.config.embed.footer diff --git a/TO REWRITE/Economy/transactions.js b/TO REWRITE/Economy/transactions.js index 426f79ec..316ac760 100644 --- a/TO REWRITE/Economy/transactions.js +++ b/TO REWRITE/Economy/transactions.js @@ -18,12 +18,11 @@ class Transactions extends Command { } async run(message, args, data) { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("economy/transactions:EMBED_TRANSACTIONS"), iconURL: message.author.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) @@ -43,8 +42,20 @@ class Transactions extends Command { if (transactions.length < 1) { embed.setDescription(message.translate("economy/transactions:NO_TRANSACTIONS")); } else { - if (sortedTransactions[0].length > 0) embed.addField(message.translate("economy/transactions:T_GOT"), sortedTransactions[0].join("\n"), true); - if (sortedTransactions[1].length > 0) embed.addField(message.translate("economy/transactions:T_SEND"), sortedTransactions[1].join("\n"), true); + if (sortedTransactions[0].length > 0) embed.addFields([ + { + name: message.translate("economy/transactions:T_GOT"), + value: sortedTransactions[0].join("\n"), + inline: true + } + ]); + if (sortedTransactions[1].length > 0) embed.addFields([ + { + name: message.translate("economy/transactions:T_SEND"), + value: sortedTransactions[1].join("\n"), + inline: true + } + ]); } message.reply({ diff --git a/TO REWRITE/Economy/work.js b/TO REWRITE/Economy/work.js index a1ed8570..218e57cf 100644 --- a/TO REWRITE/Economy/work.js +++ b/TO REWRITE/Economy/work.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { parseEmoji, EmbedBuilder } = require("discord.js"); class Work extends Command { constructor(client) { @@ -39,12 +39,11 @@ class Work extends Command { data.memberData.workStreak = (data.memberData.workStreak || 0) + 1; await data.memberData.save(); - const embed = new Discord.MessageEmbed() + const embed = new EmbedBuilder() .setFooter({ text: message.translate("economy/work:AWARD"), iconURL: message.author.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) @@ -61,22 +60,38 @@ class Work extends Command { if (data.memberData.workStreak >= 5) { won += 200; - embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", { - won: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - })) - .addField(message.translate("economy/work:STREAK"), message.translate("economy/work:STREAK_CONTENT")); + embed.addFields([ + { + name: message.translate("economy/work:SALARY"), + value: message.translate("economy/work:SALARY_CONTENT", { + won: `${won} ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + }) + }, + { + name: message.translate("economy/work:STREAK"), + value: message.translate("economy/work:STREAK_CONTENT") + } + ]); data.memberData.workStreak = 0; } else { for (let i = 0; i < award.length; i++) { if (data.memberData.workStreak > i) { - const letter = Discord.Util.parseEmoji(award[i]).name.split("_")[1]; + const letter = parseEmoji(award[i]).name.split("_")[1]; award[i] = `:regional_indicator_${letter.toLowerCase()}:`; } } - embed.addField(message.translate("economy/work:SALARY"), message.translate("economy/work:SALARY_CONTENT", { - won: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` - })) - .addField(message.translate("economy/work:STREAK"), award.join("")); + embed.addFields([ + { + name: message.translate("economy/work:SALARY"), + value: message.translate("economy/work:SALARY_CONTENT", { + won: `**${won}** ${message.getNoun(won, message.translate("misc:NOUNS:CREDIT:1"), message.translate("misc:NOUNS:CREDIT:2"), message.translate("misc:NOUNS:CREDIT:5"))}` + }) + }, + { + name: message.translate("economy/work:STREAK"), + value: award.join("") + } + ]); } const info = { diff --git a/TO REWRITE/Examples/mention.js b/TO REWRITE/Examples/mention.js index af0fe6bf..bfcc2d9f 100644 --- a/TO REWRITE/Examples/mention.js +++ b/TO REWRITE/Examples/mention.js @@ -1,3 +1,4 @@ +const { ApplicationCommandType } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Mention extends BaseCommand { @@ -9,11 +10,11 @@ class Mention extends BaseCommand { super({ command: { name: "mention", - type: 2 // Type 2 is USER COMMAND. + type: ApplicationCommandType.User }, - aliases: ["m"], // Application command aliases. + aliases: [], dirname: __dirname, - guildOnly: true // Determines whether your command is only guild. + guildOnly: true }); } /** diff --git a/TO REWRITE/Examples/ping.js b/TO REWRITE/Examples/ping.js deleted file mode 100644 index 945c6fe1..00000000 --- a/TO REWRITE/Examples/ping.js +++ /dev/null @@ -1,35 +0,0 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"); -const BaseCommand = require("../../base/BaseCommand"); - -class Ping extends BaseCommand { - /** - * - * @param {import("../../base/JaBa")} client - */ - constructor() { - super({ - command: new SlashCommandBuilder() - .setName("ping") - .setDescription("Ping command."), // This option is included in type 1. You can configure this option directly with the SlashCommandBuilder feature. - aliases: ["p"], // Application command aliases. - dirname: __dirname, - guildOnly: true // Determines whether your command is only guild. - }); - } - /** - * - * @param {import("../../base/JaBa")} client - */ - async onLoad() { - //... - } - /** - * - * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction - */ - async execute(client, interaction) { - return interaction.reply({ content: "Pong!", ephemeral: true }); - } -} -module.exports = Ping; \ No newline at end of file diff --git a/TO REWRITE/Examples/repeat.js b/TO REWRITE/Examples/repeat.js index b7bae955..f3e4eed3 100644 --- a/TO REWRITE/Examples/repeat.js +++ b/TO REWRITE/Examples/repeat.js @@ -1,3 +1,4 @@ +const { ApplicationCommandType } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Repeat extends BaseCommand { @@ -8,12 +9,12 @@ class Repeat extends BaseCommand { constructor() { super({ command: { - name: "repeat", // Application command name. - type: 3 // Type 3 is MESSAGE COMMAND. + name: "repeat", + type: ApplicationCommandType.Message }, - aliases: ["r"], // Application command aliases. + aliases: [], dirname: __dirname, - guildOnly: true // Determines whether your command is only guild. + guildOnly: true }); } /** diff --git a/TO REWRITE/Fun/8ball.js b/TO REWRITE/Fun/8ball.js deleted file mode 100644 index e0ab1bc7..00000000 --- a/TO REWRITE/Fun/8ball.js +++ /dev/null @@ -1,31 +0,0 @@ -const Command = require("../../base/Command"); - -class Eightball extends Command { - constructor(client) { - super(client, { - name: "8ball", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["8b"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - if (!args[0] || !message.content.endsWith("?")) return message.error("fun/8ball:ERR_QUESTION"); - - const answerN = this.client.functions.randomNum(1, 20); - const answer = message.translate(`fun/8ball:RESPONSE_${answerN}`); - - message.reply({ - content: answer - }); - } -} - -module.exports = Eightball; \ No newline at end of file diff --git a/TO REWRITE/Fun/ascii.js b/TO REWRITE/Fun/ascii.js deleted file mode 100644 index ae70522b..00000000 --- a/TO REWRITE/Fun/ascii.js +++ /dev/null @@ -1,34 +0,0 @@ -const Command = require("../../base/Command"), - figlet = require("figlet"), - util = require("util"), - figletAsync = util.promisify(figlet); - -class Ascii extends Command { - constructor(client) { - super(client, { - name: "ascii", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - const text = args.join(" "); - if (!text || text.length > 20) return message.error("fun/ascii:TEXT_MISSING"); - - const rendered = await figletAsync(text); - - message.reply({ - content: "```" + rendered + "```" - }); - } -} - -module.exports = Ascii; \ No newline at end of file diff --git a/TO REWRITE/Fun/flip.js b/TO REWRITE/Fun/flip.js deleted file mode 100644 index 09944fe1..00000000 --- a/TO REWRITE/Fun/flip.js +++ /dev/null @@ -1,25 +0,0 @@ -const Command = require("../../base/Command"); - -class Flip extends Command { - constructor(client) { - super(client, { - name: "flip", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["dice", "coin"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message) { - const isHeads = Math.random() > 0.5; - isHeads ? message.sendT("fun/flip:HEADS") : message.sendT("fun/flip:TAILS"); - } -} - -module.exports = Flip; \ No newline at end of file diff --git a/TO REWRITE/Fun/lmg.js b/TO REWRITE/Fun/lmg.js deleted file mode 100644 index 0742216b..00000000 --- a/TO REWRITE/Fun/lmg.js +++ /dev/null @@ -1,30 +0,0 @@ -const Command = require("../../base/Command"); - -class Lmg extends Command { - constructor(client) { - super(client, { - name: "lmg", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["lmgtfy"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const question = args.join(" "); - if (!question) return message.error("fun/lmg:MISSING"); - const encodedQuestion = question.replace(/[' '_]/g, "+"); - await message.reply({ - content: `` - }); - message.delete().catch(() => {}); - } -} - -module.exports = Lmg; \ No newline at end of file diff --git a/TO REWRITE/Fun/lovecalc.js b/TO REWRITE/Fun/lovecalc.js deleted file mode 100644 index 102f4a9d..00000000 --- a/TO REWRITE/Fun/lovecalc.js +++ /dev/null @@ -1,59 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - md5 = require("md5"); - -class Lovecalc extends Command { - constructor(client) { - super(client, { - name: "lovecalc", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["lc"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const firstMember = message.mentions.members.filter(m => m.id !== message.author.id).first(); - if (!firstMember) return message.error("fun/lovecalc:MISSING"); - const secondMember = message.mentions.members - .filter(m => m.id !== firstMember.id) - .filter(m => m.id !== message.author.id) - .first() || message.member; - if (!secondMember) return message.error("fun/lovecalc:MISSING"); - - const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10)); - const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`); - - const string = hash - .split("") - .filter(e => !isNaN(e)) - .join(""); - const percent = parseInt(string.substr(0, 2), 10); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: `❤️ ${message.translate("fun/lovecalc:DESCRIPTION")}` - }) - .setDescription(message.translate("fun/lovecalc:CONTENT", { - percent, - firstUsername: firstMember.user.username, - secondUsername: secondMember.user.username - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Lovecalc; \ No newline at end of file diff --git a/TO REWRITE/Fun/memes.js b/TO REWRITE/Fun/memes.js deleted file mode 100644 index 5026f94c..00000000 --- a/TO REWRITE/Fun/memes.js +++ /dev/null @@ -1,78 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class Memes extends Command { - constructor(client) { - super(client, { - name: "memes", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["mem"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const tag = args[0]; - const subs = ["memes", "dankmemes", "me_irl", "wholesomememes"]; - - if (tag === "list") { - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(message.translate("fun/memes:EMBED_TITLE")) - .setDescription(subs.join("\n")) - .setTimestamp(); - - message.reply({ - embeds: [embed] - }); - } else if (!tag) { - const m = await message.sendT("fun/memes:SEARCHING_RANDOM"); - - const res = await fetch("https://meme-api.herokuapp.com/gimme/").then(response => response.json()); - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) - .setImage(res.url) - .setTimestamp(); - - m.edit({ - content: null, - embeds: [embed] - }); - } else if (subs.includes(tag)) { - const m = await message.sendT("fun/memes:SEARCHING", { - tag - }); - - const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTitle(`${res.title}\n${message.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${message.translate("common:AUTHOR")}: ${res.author}\n${message.translate("fun/memes:UPS")}: ${res.ups}`) - .setImage(res.url) - .setTimestamp(); - - m.edit({ - content: null, - embeds: [embed] - }); - } else return message.error("fun/memes:NOT_FOUND"); - } -} - -module.exports = Memes; \ No newline at end of file diff --git a/TO REWRITE/General/activity.js b/TO REWRITE/General/activity.js index aa8d852f..1ddeb9b4 100644 --- a/TO REWRITE/General/activity.js +++ b/TO REWRITE/General/activity.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { PermissionsBitField } = require("discord.js"); class Activity extends Command { constructor(client) { @@ -22,7 +22,7 @@ class Activity extends Command { if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); const perms = voice.permissionsFor(this.client.user); - if (!perms.has(Discord.Permissions.FLAGS.CONNECT) || !perms.has(Discord.Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); + if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); const activities = [ "betrayal", @@ -43,7 +43,7 @@ class Activity extends Command { switch (activity) { case "betrayal": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "betrayal").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Betrayal.io") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Betrayal.io", channel: voice.name })}](${invite.code})**`) @@ -61,7 +61,7 @@ class Activity extends Command { if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "checkers").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Checkers In The Park") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Checkers In The Park", channel: voice.name })}](${invite.code})**`) @@ -79,7 +79,7 @@ class Activity extends Command { if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "chess").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Chess In The Park") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Chess In The Park", channel: voice.name })}](${invite.code})**`) @@ -95,7 +95,7 @@ class Activity extends Command { case "sketchheads": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "sketchheads").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Sketch Heads") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Sketch Heads", channel: voice.name })}](${invite.code})**`) @@ -113,7 +113,7 @@ class Activity extends Command { if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "ocho").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Ocho") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Ocho", channel: voice.name })}](${invite.code})**`) @@ -129,7 +129,7 @@ class Activity extends Command { case "fishing": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "fishing").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Fishington.io") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Fishington.io", channel: voice.name })}](${invite.code})**`) @@ -145,7 +145,7 @@ class Activity extends Command { case "lettertile": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "lettertile").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Letter Tile") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Letter Tile", channel: voice.name })}](${invite.code})**`) @@ -163,7 +163,7 @@ class Activity extends Command { if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "poker").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Poker Night") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Poker Night", channel: voice.name })}](${invite.code})**`) @@ -181,7 +181,7 @@ class Activity extends Command { if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "spellcast").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Spell Cast") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Spell Cast", channel: voice.name })}](${invite.code})**`) @@ -197,7 +197,7 @@ class Activity extends Command { case "wordsnack": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "wordsnack").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Words Snack") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Words Snack", channel: voice.name })}](${invite.code})**`) @@ -213,7 +213,7 @@ class Activity extends Command { case "puttparty": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "puttparty").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Puttparty") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Puttparty", channel: voice.name })}](${invite.code})**`) @@ -229,7 +229,7 @@ class Activity extends Command { case "youtube": this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "youtube").then(async invite => { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle("Youtube Together") .setColor(data.config.embed.color) .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Youtube Together", channel: voice.name })}](${invite.code})**`) @@ -244,7 +244,7 @@ class Activity extends Command { break; default: { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle(message.translate("general/activity:TITLE")) .setDescription(activities.join("\n")) .setColor(data.config.embed.color) diff --git a/TO REWRITE/General/avatar.js b/TO REWRITE/General/avatar.js index f875f72a..ddaefd85 100644 --- a/TO REWRITE/General/avatar.js +++ b/TO REWRITE/General/avatar.js @@ -20,7 +20,6 @@ class Avatar extends Command { let user = await this.client.resolveUser(args[0]); if (!user) user = message.author; const avatarURL = user.displayAvatarURL({ - dynamic: true, size: 512 }); diff --git a/TO REWRITE/General/emoji.js b/TO REWRITE/General/emoji.js index bfbfd5bf..7d3f9da5 100644 --- a/TO REWRITE/General/emoji.js +++ b/TO REWRITE/General/emoji.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { EmbedBuilder, parseEmoji } = require("discord.js"); class EmojiInfo extends Command { constructor(client) { @@ -21,9 +21,9 @@ class EmojiInfo extends Command { const rawEmoji = args[0]; if (!rawEmoji) return message.error("administration/stealemoji:MISSING_EMOJI"); - const parsedEmoji = Discord.Util.parseEmoji(rawEmoji); + const parsedEmoji = parseEmoji(rawEmoji); - const embed = new Discord.MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: message.translate("general/emoji:TITLE", { emoji: parsedEmoji.name @@ -33,9 +33,20 @@ class EmojiInfo extends Command { .setFooter({ text: data.config.embed.footer }) - .addField(message.translate("general/emoji:NAME"), parsedEmoji.name) - .addField(message.translate("general/emoji:ANIMATED"), parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO")) - .addField(message.translate("general/emoji:ID"), parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART")); + .addFields([ + { + name: message.translate("general/emoji:NAME"), + value: parsedEmoji.name + }, + { + name: message.translate("general/emoji:ANIMATED"), + value: parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO") + }, + { + name: message.translate("general/emoji:ID"), + value: parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART") + } + ]); message.reply({ embeds: [embed] diff --git a/TO REWRITE/General/help.js b/TO REWRITE/General/help.js index 882c3d08..aae84a44 100644 --- a/TO REWRITE/General/help.js +++ b/TO REWRITE/General/help.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { PermissionsBitField, EmbedBuilder } = require("discord.js"); class Help extends Command { constructor(client) { @@ -40,17 +40,34 @@ class Help extends Command { prefix: message.guild ? data.guild.prefix : "" }); - const groupEmbed = new Discord.MessageEmbed() + const groupEmbed = new EmbedBuilder() .setAuthor({ name: message.translate("general/help:CMD_TITLE", { cmd: cmd.help.name }) }) - .addField(message.translate("general/help:FIELD_DESCRIPTION"), description) - .addField(message.translate("general/help:FIELD_USAGE"), usage) - .addField(message.translate("general/help:FIELD_EXAMPLES"), examples) - .addField(message.translate("general/help:FIELD_ALIASES"), cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS")) - .addField(message.translate("general/help:FIELD_PERMISSIONS"), cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION")) + .addFields([ + { + name: message.translate("general/help:FIELD_DESCRIPTION"), + value: description + }, + { + name: message.translate("general/help:FIELD_USAGE"), + value: usage + }, + { + name: message.translate("general/help:FIELD_EXAMPLES"), + value: examples + }, + { + name: message.translate("general/help:FIELD_ALIASES"), + value: cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS") + }, + { + name: message.translate("general/help:FIELD_PERMISSIONS"), + value: cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION") + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer @@ -73,7 +90,7 @@ class Help extends Command { const emojis = this.client.customEmojis; - const embed = new Discord.MessageEmbed() + const embed = new EmbedBuilder() .setDescription(message.translate("general/help:INFO", { prefix: message.guild ? data.guild.prefix : "" })) @@ -83,27 +100,32 @@ class Help extends Command { }); categories.sort().forEach((cat) => { const tCommands = commands.filter((cmd) => cmd.help.category === cat); - embed.addField(`${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`, `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}`); + embed.addFields([ + { + name: `${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`, + value: `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}` + } + ]); }); - if (message.guild) { - if (data.guild.customCommands.length > 0) embed.addField(`${emojis.categories.custom} ${message.guild.name} | ${message.translate("general/help:CUSTOM_COMMANDS")} - (${data.guild.customCommands.length})`, data.guild.customCommands.map((cmd) => `\`${cmd.name}\``).join(", ")); - } - - embed.addField("\u200B", message.translate("misc:STATS_FOOTER", { - dashboardLink: this.client.config.dashboard.baseURL, - docsLink: `${this.client.config.dashboard.baseURL}/docs/`, - inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }), - donateLink: "https://qiwi.com/n/JONNYBRO/", - owner: data.config.owner.id - })); + embed.addFields([ + { + name: "\u200B", + value: message.translate("misc:STATS_FOOTER", { + dashboardLink: this.client.config.dashboard.baseURL, + docsLink: `${this.client.config.dashboard.baseURL}/docs/`, + inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator] }), + donateLink: "https://qiwi.com/n/JONNYBRO/", + owner: data.config.owner.id + }) + } + ]); embed.setAuthor({ name: message.translate("general/help:TITLE", { name: this.client.user.username }), iconURL: this.client.user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }); diff --git a/TO REWRITE/General/invite.js b/TO REWRITE/General/invite.js deleted file mode 100644 index e7e08a95..00000000 --- a/TO REWRITE/General/invite.js +++ /dev/null @@ -1,55 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Invite extends Command { - constructor(client) { - super(client, { - name: "invite", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["i"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const inviteLink = this.client.generateInvite({ - scopes: ["bot", "applications.commands"], - permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] - }); - const donateLink = "https://qiwi.com/n/JONNYBRO/"; - - if (args[0] && args[0] === "copy") return message.reply({ - content: inviteLink - }); - - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("general/invite:LINKS") - }) - .setDescription(message.translate("general/invite:TIP", { - prefix: data.guild.prefix || "" - })) - .addField(message.translate("general/invite:ADD"), message.translate("general/invite:CLICK", { - link: inviteLink - })) - .addField(message.translate("general/invite:SUPPORT"), message.translate("general/invite:CLICK", { - link: donateLink - }) + `\n*для других способов пишите в ЛС <@${data.config.owner.id}> (указывайте ваш Discord тэг чтобы я мог выдать вам ачивку)*`) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Invite; \ No newline at end of file diff --git a/TO REWRITE/General/invites.js b/TO REWRITE/General/invites.js deleted file mode 100644 index 64621010..00000000 --- a/TO REWRITE/General/invites.js +++ /dev/null @@ -1,72 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Invites extends Command { - constructor(client) { - super(client, { - name: "invites", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["invs"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_GUILD"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let member = await this.client.resolveMember(args[0], message.guild); - if (!member) member = message.member; - - const invites = await message.guild.invites.fetch().catch(() => {}); - if (!invites) return message.error("misc:ERR_OCCURRED"); - - const memberInvites = invites.filter((i) => i.inviter && i.inviter.id === member.user.id); - - if (memberInvites.size <= 0) { - if (member === message.member) { - return message.error("general/invites:NOBODY_AUTHOR"); - } else { - return message.error("general/invites:NOBODY_MEMBER", { - member: member.user.tag - }); - } - } - - const content = memberInvites.map((i) => { - return message.translate("general/invites:CODE", { - uses: i.uses, - code: i.code, - channel: i.channel.toString() - }); - }).join("\n"); - let index = 0; - memberInvites.forEach((invite) => index += invite.uses); - - const embed = new Discord.MessageEmbed() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setAuthor({ - name: message.translate("general/invites:TRACKER") - }) - .setDescription(message.translate("general/invites:TITLE", { - member: member.user.tag, - guild: message.guild.name - })) - .addField(message.translate("general/invites:FIELD_INVITED"), message.translate("general/invites:FIELD_MEMBERS", { - total: index - })) - .addField(message.translate("general/invites:FIELD_CODES"), content); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Invites; \ No newline at end of file diff --git a/TO REWRITE/General/minecraft.js b/TO REWRITE/General/minecraft.js index 22679cf7..30e44e67 100644 --- a/TO REWRITE/General/minecraft.js +++ b/TO REWRITE/General/minecraft.js @@ -60,15 +60,35 @@ class Minecraft extends Command { if (!json) return m.error("general/minecraft:FAILED", null, { edit: true }); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: json.name }) - .addField(message.translate("general/minecraft:FIELD_STATUS"), message.translate("general/minecraft:ONLINE")) - .addField(message.translate("general/minecraft:FIELD_CONNECTED"), `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}`) - .addField(message.translate("general/minecraft:FIELD_IP"), json.connect, true) - .addField(message.translate("general/minecraft:FIELD_VERSION"), json.raw.vanilla.raw.version.name, true) - .addField(message.translate("general/minecraft:FIELD_PING"), json.raw.vanilla.ping.toString()) + .addFields([ + { + name: message.translate("general/minecraft:FIELD_STATUS"), + value: message.translate("general/minecraft:ONLINE") + }, + { + name: message.translate("general/minecraft:FIELD_CONNECTED"), + value: `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}` + }, + { + name: message.translate("general/minecraft:FIELD_IP"), + value: json.connect, + inline: true + }, + { + name: message.translate("general/minecraft:FIELD_VERSION"), + value: json.raw.vanilla.raw.version.name, + inline: true + + }, + { + name: message.translate("general/minecraft:FIELD_PING"), + value: json.raw.vanilla.ping.toString() + } + ]) .setColor(data.config.embed.color) .setThumbnail(favicon) .setFooter({ diff --git a/TO REWRITE/General/permissions.js b/TO REWRITE/General/permissions.js deleted file mode 100644 index de3c1ef0..00000000 --- a/TO REWRITE/General/permissions.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -const permissions = Object.keys(Discord.Permissions.FLAGS); - -class Permissions extends Command { - constructor(client) { - super(client, { - name: "permissions", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["perms"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message) { - const member = message.mentions.members.first() || message.member; - const mPermissions = message.channel.permissionsFor(member); - const total = { - denied: 0, - allowed: 0 - }; - - let text = `**${message.translate("general/permissions:TITLE", { user: member.user.username, channel: message.channel.name })}**\n`; - permissions.forEach((perm) => { - if (perm === "REQUEST_TO_SPEAK") return; - - if (!mPermissions.has(perm)) { - text += `${message.translate(`misc:PERMISSIONS:${perm}`)} ❌\n`; - total.denied++; - } else { - text += `${message.translate(`misc:PERMISSIONS:${perm}`)} ✅\n`; - total.allowed++; - } - }); - text += `\n${total.allowed} ✅ | ${total.denied} ❌`; - - message.reply({ - content: text - }); - } -} - -module.exports = Permissions; \ No newline at end of file diff --git a/TO REWRITE/General/quote.js b/TO REWRITE/General/quote.js deleted file mode 100644 index f464a03f..00000000 --- a/TO REWRITE/General/quote.js +++ /dev/null @@ -1,88 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Quote extends Command { - constructor(client) { - super(client, { - name: "quote", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["qu"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - function embed(m) { - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: m.author.tag, - iconURL: m.author.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .setDescription(m.content) - .setColor(m.member ? m.member.roles.highest ? m.member.roles.highest.color : data.config.embed.color : data.config.embed.color) - .setFooter({ - text: m.guild.name + " | #" + m.channel.name - }) - .setTimestamp(m.createdTimestamp); - if (m.attachments.size > 0) embed.setImage(m.attachments.first().url); - return embed; - } - - const msgID = args[0]; - if (isNaN(msgID)) { - message.error("general/quote:MISSING_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - } - - let channel = args[1]; - if (args[1]) { - channel = this.client.channels.cache.get(args[1]); - if (!channel) { - message.error("general/quote:NO_MESSAGE_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - } - } - - if (!channel) { - message.channel.messages.fetch(msgID).catch(() => { - message.error("general/quote:NO_MESSAGE_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - }).then((msg) => { - if (message.deletable) message.delete(); - message.reply({ - embeds: [embed(msg)] - }); - }); - } else { - channel.messages.fetch(msgID).then((msg) => { - if (message.deletable) message.delete(); - message.reply({ - embeds: [embed(msg)] - }); - }).catch(() => { - message.error("general/quote:NO_MESSAGE_ID").then(() => { - if (message.deletable) message.delete(); - }); - return; - }); - } - } -} - -module.exports = Quote; \ No newline at end of file diff --git a/TO REWRITE/General/report.js b/TO REWRITE/General/report.js index b63c239e..e616953f 100644 --- a/TO REWRITE/General/report.js +++ b/TO REWRITE/General/report.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { EmbedBuilder, parseEmoji} = require("discord.js"); class Report extends Command { constructor(client) { @@ -30,28 +30,45 @@ class Report extends Command { const rep = args.slice(1).join(" "); if (!rep) return message.error("general/report:MISSING_REASON"); - const embed = new Discord.MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: message.translate("general/report:TITLE", { user: member.user.tag }), iconURL: message.author.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) - .addField(message.translate("common:AUTHOR"), message.author.tag, true) - .addField(message.translate("common:DATE"), this.client.printDate(new Date(Date.now())), true) - .addField(message.translate("common:REASON"), rep, true) - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) + .addFields([ + { + name: message.translate("common:AUTHOR"), + value: message.author.tag, + inline: true + }, + { + name: message.translate("common:DATE"), + value: this.client.printDate(new Date(Date.now())), + inline: true + }, + { + name: message.translate("common:REASON"), + value: rep, + inline: true + }, + { + name: message.translate("common:USER"), + value: `\`${member.user.tag}\` (${member.user.toString()})`, + inline: true + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer }); - const success = Discord.Util.parseEmoji(this.client.customEmojis.success).id; - const error = Discord.Util.parseEmoji(this.client.customEmojis.error).id; + const success = parseEmoji(this.client.customEmojis.cool).id; + const error = parseEmoji(this.client.customEmojis.notcool).id; repChannel.send({ embeds: [embed] diff --git a/TO REWRITE/General/serverinfo.js b/TO REWRITE/General/serverinfo.js index 4124ee3e..bb386b0b 100644 --- a/TO REWRITE/General/serverinfo.js +++ b/TO REWRITE/General/serverinfo.js @@ -31,32 +31,62 @@ class Serverinfo extends Command { await guild.members.fetch(); const owner = await guild.fetchOwner(); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: guild.name, - iconURL: guild.iconURL({ - dynamic: true - }) + iconURL: guild.iconURL() }) - .setThumbnail(guild.iconURL({ - dynamic: true - })) - .addField(this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"), `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})`) - .addField(this.client.customEmojis.title + message.translate("common:NAME"), guild.name, true) - .addField(this.client.customEmojis.calendar + message.translate("common:CREATION"), this.client.printDate(guild.createdAt), true) - .addField(this.client.customEmojis.users + message.translate("common:MEMBERS"), - `${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` + - "\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`, true - ) - .addField(this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"), guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"), true) - .addField(this.client.customEmojis.id + message.translate("common:ID"), guild.id, true) - .addField(this.client.customEmojis.crown + message.translate("common:OWNER"), owner.toString(), true) - .addField(this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"), guild.premiumSubscriptionCount.toString() || "0", true) - .addField(this.client.customEmojis.channels + message.translate("common:CHANNELS"), - `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` + - "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` + - "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`, true - ) + .setThumbnail(guild.iconURL()) + .addFields([ + { + name: this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"), + value: `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})` + }, + { + name: this.client.customEmojis.title + message.translate("common:NAME"), + value: guild.name, + inline: true + }, + { + name: this.client.customEmojis.calendar + message.translate("common:CREATION"), + value: this.client.printDate(guild.createdAt), + inline: true + }, + { + name: this.client.customEmojis.users + message.translate("common:MEMBERS"), + value: `${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` + + "\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`, + inline: true + }, + { + name: this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"), + value: guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"), + inline: true + }, + { + name: this.client.customEmojis.id + message.translate("common:ID"), + value: guild.id, + inline: true + }, + { + name: this.client.customEmojis.crown + message.translate("common:OWNER"), + value: owner.toString(), + inline: true + }, + { + name: this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"), + value: guild.premiumSubscriptionCount.toString() || "0", + inline: true + }, + { + name: this.client.customEmojis.channels + message.translate("common:CHANNELS"), + value: `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` + + "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` + + "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`, + inline: true + } + ]) + .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer diff --git a/TO REWRITE/General/shorturl.js b/TO REWRITE/General/shorturl.js index d353f77a..df49351d 100644 --- a/TO REWRITE/General/shorturl.js +++ b/TO REWRITE/General/shorturl.js @@ -27,7 +27,7 @@ class ShortURL extends Command { if (body === "Error: Please enter a valid URL to shorten") return message.error("general/shorturl:MISSING_URL"); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer diff --git a/TO REWRITE/General/staff.js b/TO REWRITE/General/staff.js index e05204ae..61e45dd5 100644 --- a/TO REWRITE/General/staff.js +++ b/TO REWRITE/General/staff.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { PermissionsBitField, EmbedBuilder } = require("discord.js"); class Staff extends Command { constructor(client) { @@ -19,16 +19,24 @@ class Staff extends Command { async run(message, args, data) { await message.guild.members.fetch(); - const administrators = message.guild.members.cache.filter((m) => m.permissions.has(Discord.Permissions.FLAGS.ADMINISTRATOR) && !m.user.bot); - const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(Discord.Permissions.FLAGS.MANAGE_MESSAGES) && !m.user.bot); - const embed = new Discord.MessageEmbed() + const administrators = message.guild.members.cache.filter((m) => m.permissions.has(PermissionsBitField.Flags.Administrator) && !m.user.bot); + const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(PermissionsBitField.Flags.ManageMessages) && !m.user.bot); + const embed = new EmbedBuilder() .setAuthor({ name: message.translate("general/staff:TITLE", { guild: message.guild.name }) }) - .addField(message.translate("general/staff:ADMINS"), (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS"))) - .addField(message.translate("general/staff:MODS"), (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS"))) + .addFields([ + { + name: message.translate("general/staff:ADMINS"), + value: (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS")) + }, + { + name: message.translate("general/staff:MODS"), + value: (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS")) + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer diff --git a/TO REWRITE/General/stats.js b/TO REWRITE/General/stats.js index 4164aa37..f2b96444 100644 --- a/TO REWRITE/General/stats.js +++ b/TO REWRITE/General/stats.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { PermissionsBitField, EmbedBuilder, version } = require("discord.js"); class Stats extends Command { constructor(client) { @@ -22,7 +22,7 @@ class Stats extends Command { const users = this.client.users.cache.size - hiddenGuild.memberCount; const servers = this.client.guilds.cache.size - 1; - const statsEmbed = new Discord.MessageEmbed() + const statsEmbed = new EmbedBuilder() .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer @@ -31,29 +31,56 @@ class Stats extends Command { name: message.translate("common:STATS") }) .setDescription(message.translate("general/stats:MADE")) - .addField(this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"), message.translate("general/stats:COUNTS_CONTENT", { - servers: servers, - users: users - }), true) - .addField(this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"), `\`Discord.js : v${Discord.version}\`\n\`Nodejs : v${process.versions.node}\``, true) - .addField(this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"), `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, true) - .addField(this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"), message.translate("general/stats:ONLINE_CONTENT", { - time: this.client.convertTime(Date.now() + this.client.uptime, "from", true) - })) - .addField(this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"), message.translate("general/stats:MUSIC_CONTENT", { - count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}` - })) - .addField(message.translate("general/stats:CREDITS_TITLE"), message.translate("general/stats:CREDITS_CONTENT", { - donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"), - translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua:"].join("\n") - })) - .addField(this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"), message.translate("misc:STATS_FOOTER", { - dashboardLink: this.client.config.dashboard.baseURL, - docsLink: `${this.client.config.dashboard.baseURL}/docs/`, - inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [Discord.Permissions.FLAGS.ADMINISTRATOR] }), - donateLink: "https://qiwi.com/n/JONNYBRO/", - owner: data.config.owner.id - })); + .addFields([ + { + name: this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"), + value: message.translate("general/stats:COUNTS_CONTENT", { + servers: servers, + users: users + }), + inline: true + }, + { + name: this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"), + value: `\`Discord.js: v${version}\`\n\`Nodejs: v${process.versions.node}\``, + inline: true + }, + { + name: this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"), + value: `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, + inline: true + }, + { + name: this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"), + value: message.translate("general/stats:ONLINE_CONTENT", { + time: this.client.convertTime(Date.now() + this.client.uptime, true, true) + }) + }, + { + name: this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"), + value: message.translate("general/stats:MUSIC_CONTENT", { + count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}` + }) + }, + { + name: message.translate("general/stats:CREDITS_TITLE"), + value: message.translate("general/stats:CREDITS_CONTENT", { + donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"), + translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua: (НЕ ОБНОВЛЕН!)"].join("\n") + }) + }, + { + name: this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"), + value: message.translate("misc:STATS_FOOTER", { + dashboardLink: this.client.config.dashboard.baseURL, + docsLink: `${this.client.config.dashboard.baseURL}/docs/`, + inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator ] }), + donateLink: "https://qiwi.com/n/JONNYBRO/", + owner: data.config.owner.id + }) + } + ]); + message.reply({ embeds: [statsEmbed] }); diff --git a/TO REWRITE/General/suggest.js b/TO REWRITE/General/suggest.js index e4fd01f6..c7a3eabb 100644 --- a/TO REWRITE/General/suggest.js +++ b/TO REWRITE/General/suggest.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - Discord = require("discord.js"); + { EmbedBuilder, parseEmoji } = require("discord.js"); class Suggest extends Command { constructor(client) { @@ -26,27 +26,39 @@ class Suggest extends Command { const sugg = args.join(" "); if (!sugg) return message.error("general/suggest:MISSING_CONTENT"); - const embed = new Discord.MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: message.translate("general/suggest:TITLE", { user: message.author.username }), iconURL: message.author.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) - .addField(message.translate("common:AUTHOR"), `\`${message.author.username}#${message.author.discriminator}\``, true) - .addField(message.translate("common:DATE"), this.client.printDate(new Date(Date.now())), true) - .addField(message.translate("common:CONTENT"), sugg) + .addFields([ + { + name: message.translate("common:AUTHOR"), + value: `\`${message.author.username}#${message.author.discriminator}\``, + inline: true + }, + { + name: message.translate("common:DATE"), + value: this.client.printDate(new Date(Date.now())), + inline: true + }, + { + name: message.translate("common:CONTENT"), + value: sugg + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer }); - const success = Discord.Util.parseEmoji(this.client.customEmojis.cool).id; - const error = Discord.Util.parseEmoji(this.client.customEmojis.notcool).id; + const success = parseEmoji(this.client.customEmojis.cool).id; + const error = parseEmoji(this.client.customEmojis.notcool).id; suggChannel.send({ embeds: [embed] diff --git a/TO REWRITE/General/translate.js b/TO REWRITE/General/translate.js deleted file mode 100644 index b5bb2219..00000000 --- a/TO REWRITE/General/translate.js +++ /dev/null @@ -1,72 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - translate = require("@k3rn31p4nic/google-translate-api"); - -const langs = ["afrikaans", "albanian", "amharic", "arabic", "armenian", "azerbaijani", "bangla", "basque", "belarusian", "bengali", "bosnian", "bulgarian", "burmese", "catalan", "cebuano", "chichewa", "corsican", "croatian", "czech", "danish", "dutch", "english", "esperanto", "estonian", "filipino", "finnish", "french", "frisian", "galician", "georgian", "german", "greek", "gujarati", "haitian creole", "hausa", "hawaiian", "hebrew", "hindi", "hmong", "hungarian", "icelandic", "igbo", "indonesian", "irish", "italian", "japanese", "javanese", "kannada", "kazakh", "khmer", "korean", "kurdish (kurmanji)", "kyrgyz", "lao", "latin", "latvian", "lithuanian", "luxembourgish", "macedonian", "malagasy", "malay", "malayalam", "maltese", "maori", "marathi", "mongolian", "myanmar (burmese)", "nepali", "norwegian", "nyanja", "pashto", "persian", "polish", "portugese", "punjabi", "romanian", "russian", "samoan", "scottish gaelic", "serbian", "sesotho", "shona", "sindhi", "sinhala", "slovak", "slovenian", "somali", "spanish", "sundanese", "swahili", "swedish", "tajik", "tamil", "telugu", "thai", "turkish", "ukrainian", "urdu", "uzbek", "vietnamese", "welsh", "xhosa", "yiddish", "yoruba", "zulu"]; - -class Translate extends Command { - constructor(client) { - super(client, { - name: "translate", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["tran"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - if (args[0] === "langs-list") { - const langsList = "```css\n" + (langs.map((lang, i) => `${i + 1} - ${lang}`).join("\n")) + "```"; - message.author.send(langsList).then(() => { - message.success("general/translate:LIST_SENT"); - }).catch(() => { - message.error("misc:CANNOT_DM"); - }); - return; - } - - const pWait = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - if (!args[0]) return pWait.error("general/translate:MISSING_LANGUAGE", { prefix: data.guild.prefix }, { edit: true }); - if (!args[1]) return pWait.error("general/translate:MISSING_CONTENT", null, { edit: true }); - - // Gets different args - const language = args[0].toLowerCase(); - const toTranslate = args.slice(1).join(" "); - - if (!langs.includes(language)) return pWait.error("general/translate:INVALID_LANGUAGE", { prefix: data.guild.prefix, search: language }, { edit: true }); - - const translated = await translate(toTranslate, { to: language }); - - const resEmbed = new Discord.MessageEmbed() - .setAuthor({ - name: "Переводчик", - iconURL: this.client.user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - }) - }) - .addField(translated.from.language.iso, "```" + toTranslate + "```") - .addField(language, "```" + translated.text + "```") - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - return pWait.edit({ - content: null, - embeds: [resEmbed] - }); - } -} - -module.exports = Translate; \ No newline at end of file diff --git a/TO REWRITE/General/userinfo.js b/TO REWRITE/General/userinfo.js index 32d57873..5f292485 100644 --- a/TO REWRITE/General/userinfo.js +++ b/TO REWRITE/General/userinfo.js @@ -39,27 +39,44 @@ class Userinfo extends Command { let member = null; if (message.guild) member = await message.guild.members.fetch(user).catch(() => {}); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: `${user.tag} (${user.id})`, iconURL: user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) - .setThumbnail(user.displayAvatarURL({ - dynamic: true - })) - .addField(":man: " + message.translate("common:USERNAME"), user.username, true) - .addField(this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"), user.discriminator, true) - .addField(this.client.customEmojis.bot + " " + message.translate("common:ROBOT"), (user.bot ? message.translate("common:YES") : message.translate("common:NO")), true) - .addField(this.client.customEmojis.calendar + " " + message.translate("common:CREATION"), this.client.printDate(user.createdAt), true) - .addField(this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), user.displayAvatarURL({ - size: 512, - dynamic: true, - format: "png" - })) + .setThumbnail(user.displayAvatarURL()) + .addFields([ + { + name: ":man: " + message.translate("common:USERNAME"), + value: member.nickname || user.username, + inline: true + }, + { + name: this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"), + value: user.discriminator, + inline: true + }, + { + name: this.client.customEmojis.bot + " " + message.translate("common:ROBOT"), + value: (user.bot ? message.translate("common:YES") : message.translate("common:NO")), + inlinee: true + }, + { + name: this.client.customEmojis.calendar + " " + message.translate("common:CREATION"), + value: this.client.printDate(user.createdAt), + inline: true + }, + { + name: this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), + value: member.displayAvatarURL({ + size: 512, + format: "png" + }) + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer @@ -67,22 +84,58 @@ class Userinfo extends Command { if (displayPresence) { if (member.presence.activities[0].name === "Custom Status") { - embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")), true); - embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true); + embed.addFields([ + { + name: this.client.customEmojis.games + " " + message.translate("common:GAME"), + value: (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")), + inline: true + }, + { + name: this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), + value: message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), + inline: true + } + ]); } else { - embed.addField(this.client.customEmojis.games + " " + message.translate("common:GAME"), (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")), true); - embed.addField(this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), true); + embed.addFields([ + { + name: this.client.customEmojis.games + " " + message.translate("common:GAME"), + value: (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")), + inline: true + }, + { + name: this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), + value: message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), + inline: true + } + ]); } } if (member) { - // embed.addField(this.client.customEmojis.up + " " + message.translate("general/userinfo:ROLE"), (member.roles.highest ? member.roles.highest : message.translate("general/userinfo:NO_ROLE")), true) - embed.addField(this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"), this.client.printDate(member.joinedAt), true); - embed.addField(this.client.customEmojis.color + " " + message.translate("common:COLOR"), member.displayHexColor, true); - embed.addField(this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"), (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")), true); - embed.addField(this.client.customEmojis.roles + " " + message.translate("common:ROLES"), (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", { - count: member.roles.cache.size - 10 - }) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", "))); + embed.addFields([ + { + name: this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"), + value: this.client.printDate(member.joinedAt), + inline: true + }, + { + name: this.client.customEmojis.color + " " + message.translate("common:COLOR"), + value: member.displayHexColor, + inline: true + }, + { + name: this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"), + value: (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")), + inline: true + }, + { + name: this.client.customEmojis.roles + " " + message.translate("common:ROLES"), + value: (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", { + count: member.roles.cache.size - 10 + }) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", ")) + } + ]); } message.reply({ diff --git a/TO REWRITE/General/whois.js b/TO REWRITE/General/whois.js index 93c741c4..adbb996f 100644 --- a/TO REWRITE/General/whois.js +++ b/TO REWRITE/General/whois.js @@ -24,7 +24,7 @@ class Whois extends Command { const whois = await fetch(`http://ip-api.com/json/${args[0]}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json()); if (whois.status === "fail") { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setDescription(whois.message) .setTitle(message.translate("general/whois:ERROR", { ip: args[0] @@ -39,7 +39,7 @@ class Whois extends Command { }); } - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle(message.translate("general/whois:INFO_ABOUT", { ip: args[0] })) @@ -49,14 +49,14 @@ class Whois extends Command { .setColor(data.config.embed.color) .addFields( { name: "IP", value: whois.query, inline: true }, - { name: message.translate("general/whois:COUNTRY"), value: `${whois.country || "Неизвестно"} (${whois.countryCode || "Неизвестно"})`, inline: true }, - { name: message.translate("general/whois:REGION"), value: `${whois.regionName || "Неизвестно"} (${whois.region || "Неизвестно"})`, inline: true }, - { name: message.translate("general/whois:CITY"), value: `${whois.city || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:ZIP"), value: `${whois.zip || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || "Неизвестно"} (${whois.continentCode || "Неизвестно"})`, inline: true }, - { name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || "Неизвестно"}`, inline: true }, - { name: message.translate("general/whois:ISP"), value: `${whois.isp || "Неизвестно"}`, inline: true } + { name: message.translate("general/whois:COUNTRY"), value: `${whois.country || message.translate("common:UNKNOWN")} (${whois.countryCode || message.translate("common:UNKNOWN")})`, inline: true }, + { name: message.translate("general/whois:REGION"), value: `${whois.regionName || message.translate("common:UNKNOWN")} (${whois.region || message.translate("common:UNKNOWN")})`, inline: true }, + { name: message.translate("general/whois:CITY"), value: `${whois.city || message.translate("common:UNKNOWN")}`, inline: true }, + { name: message.translate("general/whois:ZIP"), value: `${whois.zip || message.translate("common:UNKNOWN")}`, inline: true }, + { name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || message.translate("common:UNKNOWN")}`, inline: true }, + { name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || message.translate("common:UNKNOWN")} (${whois.continentCode || message.translate("common:UNKNOWN")})`, inline: true }, + { name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || message.translate("common:UNKNOWN")}`, inline: true }, + { name: message.translate("general/whois:ISP"), value: `${whois.isp || message.translate("common:UNKNOWN")}`, inline: true } ) .setTimestamp(); diff --git a/TO REWRITE/Moderation/announcement.js b/TO REWRITE/Moderation/announcement.js index e6a604bc..35508fd4 100644 --- a/TO REWRITE/Moderation/announcement.js +++ b/TO REWRITE/Moderation/announcement.js @@ -77,7 +77,7 @@ class Announcement extends Command { collector.on("end", (collected, reason) => { if (reason === "time") return message.error("misc:TIMES_UP"); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("moderation/announcement:TITLE") }) diff --git a/TO REWRITE/Moderation/ban.js b/TO REWRITE/Moderation/ban.js deleted file mode 100644 index 16090e9c..00000000 --- a/TO REWRITE/Moderation/ban.js +++ /dev/null @@ -1,112 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Ban extends Command { - constructor(client) { - super(client, { - name: "ban", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["b"], - memberPermissions: ["BAN_MEMBERS"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const user = await this.client.resolveUser(args[0]); - if (!user) return message.error("moderation/ban:MISSING_MEMBER"); - - const memberData = message.guild.members.cache.get(user.id) ? await this.client.findOrCreateMember({ - id: user.id, - guildID: message.guild.id - }) : null; - - if (user.id === message.author.id) return message.error("moderation/ban:YOURSELF"); - - // If the user is already banned - const banned = await message.guild.bans.fetch(); - if (banned.some((m) => m.user.id === user.id)) return message.error("moderation/ban:ALREADY_BANNED", { - username: user.tag - }); - - // Gets the ban reason - let reason = args.slice(1).join(" "); - if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); - - const member = await message.guild.members.fetch(user.id).catch(() => {}); - if (member) { - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - if (!member.bannable) return message.error("moderation/ban:MISSING_PERM"); - } - - await user.send(message.translate("moderation/ban:BANNED_DM", { - username: user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - })).catch(() => {}); - - // Ban the user - message.guild.members.ban(user, { - reason - }).then(() => { - // Send a success message in the current channel - message.reply({ - content: message.translate("moderation/ban:BANNED", { - username: user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "ban", - case: data.guild.casesCount, - reason - }; - - if (memberData) { - memberData.sanctions.push(caseInfo); - memberData.save(); - } - - data.guild.casesCount++; - data.guild.save(); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/ban:CASE", { - count: data.guild.casesCount - }) - }) - .addField(message.translate("common:USER"), `\`${user.tag}\` (${user.toString()})`, true) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) - .addField(message.translate("common:REASON"), reason, true) - .setColor("#e02316"); - channel.send({ - embeds: [embed] - }); - } - - }).catch((err) => { - console.log(err); - return message.error("moderation/ban:MISSING_PERM"); - }); - } -} - -module.exports = Ban; \ No newline at end of file diff --git a/TO REWRITE/Moderation/kick.js b/TO REWRITE/Moderation/kick.js deleted file mode 100644 index c2fbee21..00000000 --- a/TO REWRITE/Moderation/kick.js +++ /dev/null @@ -1,100 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Kick extends Command { - constructor(client) { - super(client, { - name: "kick", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["k"], - memberPermissions: ["KICK_MEMBERS"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "KICK_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/kick:MISSING_MEMBER"); - - if (member.id === message.author.id) return message.error("moderation/kick:YOURSELF"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - // Gets the kcik reason - let reason = args.slice(1).join(" "); - if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - if (!member.kickable) return message.error("moderation/kick:MISSING_PERM"); - - await member.send({ - content: message.translate("moderation/kick:KICKED_DM", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - - // Kick the user - member.kick(reason).then(() => { - // Send a success message in the current channel - message.reply({ - content: message.translate("moderation/kick:KICKED", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - - data.guild.casesCount++; - data.guild.save(); - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "kick", - case: data.guild.casesCount, - reason, - }; - - memberData.sanctions.push(caseInfo); - memberData.save(); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/kick:CASE", { - count: data.guild.casesCount - }) - }) - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) - .addField(message.translate("common:REASON"), reason, true) - .setColor("#e88709"); - channel.send({ - embeds: [embed] - }); - } - - }).catch(() => { - return message.error("moderation/kick:MISSING_PERM"); - }); - } -} - -module.exports = Kick; \ No newline at end of file diff --git a/TO REWRITE/Moderation/mute.js b/TO REWRITE/Moderation/mute.js deleted file mode 100644 index 4d07030b..00000000 --- a/TO REWRITE/Moderation/mute.js +++ /dev/null @@ -1,113 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - ms = require("ms"); - -class Mute extends Command { - constructor(client) { - super(client, { - name: "mute", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["m"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/mute:MISSING_MEMBER"); - if (member.id === message.author.id) return message.error("moderation/mute:YOURSELF"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - const time = args[1]; - if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME"); - let reason = args.slice(2).join(" "); - if (!reason) reason = message.translate("misc:NO_REASON_PROVIDED"); - - message.guild.channels.cache.forEach((channel) => { - channel.permissionOverwrites.edit(member.id, { - SEND_MESSAGES: false, - ADD_REACTIONS: false, - CONNECT: false - }).catch(() => {}); - }); - - member.send({ - content: message.translate("moderation/mute:MUTED_DM", { - username: member.user.username, - server: message.guild.name, - moderator: message.author.tag, - time, - reason - }) - }); - - message.success("moderation/mute:MUTED", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - time, - reason - }); - - data.guild.casesCount++; - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "mute", - case: data.guild.casesCount, - reason, - time - }; - - memberData.mute.muted = true; - memberData.mute.endDate = Date.now() + ms(time); - memberData.mute.case = data.guild.casesCount; - memberData.sanctions.push(caseInfo); - - memberData.markModified("sanctions"); - memberData.markModified("mute"); - - await memberData.save(); - await data.guild.save(); - - this.client.databaseCache.mutedUsers.set(`${member.id}${message.guild.id}`, memberData); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - const embed = new Discord.MessageEmbed() - .setAuthor({ - name: message.translate("moderation/mute:CASE", { - count: data.guild.casesCount - }) - }) - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`, true) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`, true) - .addField(message.translate("common:REASON"), reason, true) - .addField(message.translate("common:DURATION"), time, true) - .addField(message.translate("common:EXPIRY"), this.client.printDate(new Date(Date.now() + ms(time))), true) - .setColor("#f44271"); - channel.send({ - embeds: [embed] - }); - } - } -} - -module.exports = Mute; \ No newline at end of file diff --git a/TO REWRITE/Moderation/poll.js b/TO REWRITE/Moderation/poll.js index 070c607e..79edc8f2 100644 --- a/TO REWRITE/Moderation/poll.js +++ b/TO REWRITE/Moderation/poll.js @@ -85,15 +85,20 @@ class Poll extends Command { this.client.emojis.cache.find(e => e.name === error) ]; - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("moderation/poll:TITLE") }) .setColor(data.config.embed.color) - .addField(question, message.translate("moderation/poll:REACT", { - success: emojis[0].toString(), - error: emojis[1].toString() - })); + .addFields([ + { + name: question, + value: message.translate("moderation/poll:REACT", { + success: emojis[0].toString(), + error: emojis[1].toString() + }) + } + ]); message.channel.send({ content: mention, diff --git a/TO REWRITE/Moderation/unmute.js b/TO REWRITE/Moderation/unmute.js deleted file mode 100644 index 6a8fb313..00000000 --- a/TO REWRITE/Moderation/unmute.js +++ /dev/null @@ -1,47 +0,0 @@ -const Command = require("../../base/Command"); - -class Unmute extends Command { - constructor(client) { - super(client, { - name: "unmute", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["um"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "MANAGE_CHANNELS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.success("moderation/unmute:MISSING_MEMBER"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - if (memberData.mute.muted) { - memberData.mute.endDate = Date.now(); - memberData.markModified("mute"); - memberData.save(); - message.success("moderation/unmute:SUCCESS", { - username: member.user.tag - }); - } else { - message.error("moderation/unmute:NOT_MUTED", { - username: member.user.tag - }); - } - } -} - -module.exports = Unmute; \ No newline at end of file diff --git a/TO REWRITE/Moderation/untimeout.js b/TO REWRITE/Moderation/untimeout.js new file mode 100644 index 00000000..3c0747b9 --- /dev/null +++ b/TO REWRITE/Moderation/untimeout.js @@ -0,0 +1,60 @@ +const Command = require("../../base/Command"); + +class Untimeout extends Command { + constructor(client) { + super(client, { + name: "untimeout", + dirname: __dirname, + enabled: true, + guildOnly: true, + aliases: ["untimeout"], + memberPermissions: ["BAN_MEMBERS"], + botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], + nsfw: false, + ownerOnly: false, + cooldown: 1000 + }); + } + + async run(message, args) { + let user = null; + + if (!args[0]) return message.error("moderation/unban:MISSING_ID"); + + // Check if the arg is an ID or a username + const isId = !isNaN(args[0]); + + if (isId) { + // Try to find a user with that ID + await this.client.users.fetch(args[0]).then((u) => { + // if a user was found + user = u; + }).catch(() => {}); + } else if (!isId) { + const arr = args[0].split("#"); + if (arr.length < 2) { + return message.error("misc:NO_USER_FOUND_ID", { + id: args[0] + }); + } + user = this.client.users.filter((u) => u.username === arr[0]).find((u) => u.discriminator === arr[1]); + } + + if (!user) return message.error("misc:NO_USER_FOUND_ID", { id: args[0] }); + + // check if the user is banned + const banned = await message.guild.bans.fetch(); + if (!banned.some((e) => e.user.id === user.id)) return message.success("moderation/unban:NOT_BANNED", { username: user.tag }); + + // Unban user + message.guild.members.unban(user).catch(() => {}); + + // Send a success message in the current channel + message.success("moderation/unban:UNBANNED", { + username: user.tag, + server: message.guild.name + }); + } +} + +module.exports = Untimeout; \ No newline at end of file diff --git a/TO REWRITE/Moderation/warn.js b/TO REWRITE/Moderation/warn.js index 698978fc..a586d7bf 100644 --- a/TO REWRITE/Moderation/warn.js +++ b/TO REWRITE/Moderation/warn.js @@ -53,10 +53,22 @@ class Warn extends Command { reason }; - const embed = new Discord.MessageEmbed() - .addField(message.translate("common:USER"), `\`${member.user.tag}\` (${member.user.toString()})`) - .addField(message.translate("common:MODERATOR"), `\`${message.author.tag}\` (${message.author.toString()})`) - .addField(message.translate("common:REASON"), reason, true); + const embed = new Discord.EmbedBuilder() + .addFields([ + { + name: message.translate("common:USER"), + value: `\`${member.user.tag}\` (${member.user.toString()})` + }, + { + name: message.translate("common:MODERATOR"), + value: `\`${message.author.tag}\` (${message.author.toString()})` + }, + { + name: message.translate("common:REASON"), + value: reason, + inline: true + } + ]); if (banCount) { if (sanctions >= banCount) { diff --git a/TO REWRITE/Moderation/sanctions.js b/TO REWRITE/Moderation/warns.js similarity index 81% rename from TO REWRITE/Moderation/sanctions.js rename to TO REWRITE/Moderation/warns.js index 794267f3..60d5d19d 100644 --- a/TO REWRITE/Moderation/sanctions.js +++ b/TO REWRITE/Moderation/warns.js @@ -26,12 +26,11 @@ class Warns extends Command { guildID: message.guild.id }); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: user.tag, iconURL: user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) @@ -49,7 +48,13 @@ class Warns extends Command { }); } else { memberData.sanctions.forEach((s) => { - embed.addField(s.type + " | #" + s.case, `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`, true); + embed.addFields([ + { + name: s.type + " | #" + s.case, + value: `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`, + inline: true + } + ]); }); } message.reply({ diff --git a/TO REWRITE/Music/back.js b/TO REWRITE/Music/back.js index e5fac879..5340b1c5 100644 --- a/TO REWRITE/Music/back.js +++ b/TO REWRITE/Music/back.js @@ -25,7 +25,7 @@ class Back extends Command { if (!queue) return message.error("music/play:NOT_PLAYING"); if (!queue.previousSongs[0]) return message.error("music/back:NO_PREV_SONG"); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("music/back:DESCRIPTION") }) diff --git a/TO REWRITE/Music/clips.js b/TO REWRITE/Music/clips.js index e687a05a..ab7cec01 100644 --- a/TO REWRITE/Music/clips.js +++ b/TO REWRITE/Music/clips.js @@ -28,7 +28,7 @@ class Clips extends Command { clips.push(file.substring(0, file.length - 4)); }); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setTitle(message.translate("music/clips:EMBED_TITLE")) .setDescription(clips.join("\n")) .setColor(data.config.embed.color) diff --git a/TO REWRITE/Music/jump.js b/TO REWRITE/Music/jump.js index 0006e4fa..dbbb5a1a 100644 --- a/TO REWRITE/Music/jump.js +++ b/TO REWRITE/Music/jump.js @@ -26,7 +26,7 @@ class Jump extends Command { if (!queue) return message.error("music/play:NOT_PLAYING"); if (number < 0) return message.error("music/jump:NO_PREV_SONG", { prefix: data.guild.prefix }); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("music/jump:SUCCESS") }) diff --git a/TO REWRITE/Music/np.js b/TO REWRITE/Music/np.js index 08a5d85a..eab34af0 100644 --- a/TO REWRITE/Music/np.js +++ b/TO REWRITE/Music/np.js @@ -1,14 +1,14 @@ const Command = require("../../base/Command"), Discord = require("discord.js"); -class Np extends Command { +class Nowplaying extends Command { constructor(client) { super(client, { - name: "np", + name: "nowplaying", dirname: __dirname, enabled: true, guildOnly: true, - aliases: ["nowplaying"], + aliases: [], memberPermissions: [], botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], nsfw: false, @@ -39,15 +39,29 @@ class Np extends Command { : message.translate("music/np:DISABLED") }\``; - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("music/queue:TITLE") }) .setThumbnail(track.thumbnail) - .addField(message.translate("music/np:T_TITLE"), `[${track.name}](${track.url})`) - .addField(message.translate("music/np:T_CHANNEL"), track.uploader.name ? track.uploader.name : "Отсутствует") - .addField(message.translate("music/np:T_DURATION"), `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}`) - .addField(message.translate("music/np:T_CONF"), status(queue)) + .addFields([ + { + name: message.translate("music/np:T_TITLE"), + value: `[${track.name}](${track.url})` + }, + { + name: message.translate("music/np:T_CHANNEL"), + value: track.uploader.name || message.translate("common:UNKNOWN") + }, + { + name: message.translate("music/np:T_DURATION"), + value: `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}` + }, + { + name: message.translate("music/np:T_CONF"), + value: status(queue) + } + ]) .setColor(data.config.embed.color) .setFooter({ text: data.config.embed.footer @@ -60,4 +74,4 @@ class Np extends Command { } } -module.exports = Np; \ No newline at end of file +module.exports = Nowplaying; \ No newline at end of file diff --git a/TO REWRITE/Music/play.js b/TO REWRITE/Music/play.js index 8ae57349..6f0ddb00 100644 --- a/TO REWRITE/Music/play.js +++ b/TO REWRITE/Music/play.js @@ -1,5 +1,5 @@ const Command = require("../../base/Command"), - { Permissions } = require("discord.js"); + { PermissionsBitField } = require("discord.js"); class Play extends Command { constructor(client) { @@ -25,7 +25,7 @@ class Play extends Command { // Check my permissions const perms = voice.permissionsFor(this.client.user); - if (!perms.has(Permissions.FLAGS.CONNECT) || !perms.has(Permissions.FLAGS.SPEAK)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); + if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); try { this.client.player.play(message.member.voice.channel, args.join(" "), { diff --git a/TO REWRITE/Music/queue.js b/TO REWRITE/Music/queue.js index 972f0768..5aac7b8a 100644 --- a/TO REWRITE/Music/queue.js +++ b/TO REWRITE/Music/queue.js @@ -1,6 +1,6 @@ const Command = require("../../base/Command"), Discord = require("discord.js"), - Pagination = require("discord-paginationembed"); + Pagination = require("customizable-discordjs-pagination"); class Queue extends Command { constructor(client) { @@ -26,14 +26,17 @@ class Queue extends Command { if (!queue) return message.error("music/play:NOT_PLAYING"); if (queue.songs.length === 1) { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("music/queue:TITLE"), - iconURL: message.guild.iconURL({ - dynamic: true - }) + iconURL: message.guild.iconURL() }) - .addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`) + .addFields([ + { + name: message.translate("music/np:CURRENTLY_PLAYING"), + value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` + } + ]) .setColor(data.config.embed.color); return message.reply({ embeds: [embed] @@ -46,11 +49,14 @@ class Queue extends Command { .setColor(data.config.embed.color) .setAuthor({ name: message.translate("music/queue:TITLE"), - iconURL: message.guild.iconURL({ - dynamic: true - }) + iconURL: message.guild.iconURL() }) - .addField(message.translate("music/np:CURRENTLY_PLAYING"), `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`); + .addFields([ + { + name: message.translate("music/np:CURRENTLY_PLAYING"), + value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` + } + ]); FieldsEmbed .setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : []) .setAuthorizedUsers([message.author.id]) diff --git a/TO REWRITE/Music/skip.js b/TO REWRITE/Music/skip.js index ff403bc5..4afd4b1e 100644 --- a/TO REWRITE/Music/skip.js +++ b/TO REWRITE/Music/skip.js @@ -25,7 +25,7 @@ class Skip extends Command { if (!queue) return message.error("music/play:NOT_PLAYING"); if (!queue.songs[1]) return message.error("music/skip:NO_NEXT_SONG"); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("music/skip:SUCCESS") }) diff --git a/TO REWRITE/Music/stop.js b/TO REWRITE/Music/stop.js index 6607bf89..d312d8cf 100644 --- a/TO REWRITE/Music/stop.js +++ b/TO REWRITE/Music/stop.js @@ -24,7 +24,7 @@ class Stop extends Command { if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); if (!queue) return message.error("music/play:NOT_PLAYING"); - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: message.translate("music/stop:DESCRIPTION") }) diff --git a/base/BaseCommand.js b/base/BaseCommand.js index 03d8df3d..1bfc0513 100644 --- a/base/BaseCommand.js +++ b/base/BaseCommand.js @@ -4,7 +4,7 @@ const path = require("path"); class BaseCommand { constructor(options, client) { /** - * @type {import("@discordjs/builders").SlashCommandBuilder | import("discord.js").ApplicationCommandData} + * @type {import("discord.js").SlashCommandBuilder | import("discord.js").ApplicationCommandData} */ this.command = options.command; /** diff --git a/base/JaBa.js b/base/JaBa.js index fb025bba..7212b7f1 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -1,14 +1,13 @@ -const { MessageEmbed, Client, Collection } = require("discord.js"), +const { EmbedBuilder, Client, Collection } = require("discord.js"), { GiveawaysManager } = require("discord-giveaways"), { SoundCloudPlugin } = require("@distube/soundcloud"), { SpotifyPlugin } = require("@distube/spotify"), { YtDlpPlugin } = require("@distube/yt-dlp"), - { SlashCommandBuilder } = require("@discordjs/builders"), + { SlashCommandBuilder } = require("discord.js"), { REST } = require("@discordjs/rest"), - { Routes } = require("discord-api-types/v9"); + { Routes } = require("discord-api-types/v10"); -const util = require("util"), - BaseEvent = require("./BaseEvent.js"), +const BaseEvent = require("./BaseEvent.js"), BaseCommand = require("./BaseCommand.js"), AmeClient = require("amethyste-api"), path = require("path"), @@ -33,7 +32,7 @@ class JaBa extends Client { this.languages = require("../languages/language-meta"); // Load the bot's languages this.commands = new Collection(); // Creates new commands collection this.logger = require("../helpers/logger"); // Load the logger file - this.wait = util.promisify(setTimeout); // client.wait(1000) - Wait 1 second + this.wait = require("node:timers/promises").setTimeout; // client.wait(1000) - Wait 1 second this.functions = require("../helpers/functions"); // Load the functions file this.guildsData = require("../base/Guild"); // Guild mongoose model this.usersData = require("../base/User"); // User mongoose model @@ -59,7 +58,7 @@ class JaBa extends Client { new SoundCloudPlugin(), new YtDlpPlugin() ], - youtubeDL: false, + directLink: true, emitNewSongOnly: true, leaveOnEmpty: true, leaveOnFinish: true, @@ -88,7 +87,7 @@ class JaBa extends Client { .on("addList", (queue, playlist) => queue.textChannel.send({ content: this.translate("music/play:ADDED_QUEUE_COUNT", { songCount: `**${playlist.songs.length}** ${this.getNoun(playlist.songs.length, this.translate("misc:NOUNS:TRACKS:1"), this.translate("misc:NOUNS:TRACKS:1"), this.translate("misc:NOUNS:TRACKS:2"), this.translate("misc:NOUNS:TRACKS:5"))}` }, queue.textChannel.guild.data.language) })) .on("searchResult", (message, result) => { let i = 0; - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setDescription(result.map(song => `**${++i} -** ${song.name}`).join("\n")) .setFooter({ text: this.translate("music/play:RESULTS_FOOTER", null, message.guild.data.language) }) .setColor(this.config.embed.color); @@ -126,7 +125,7 @@ class JaBa extends Client { async loadCommands(dir) { const filePath = path.join(__dirname, dir); var folders = await fs.readdir(filePath); folders = folders.map(file => path.join(filePath, file)).filter(async (path) => { path = await fs.lstat(path); path.isDirectory(); }); - const rest = new REST({ version: "9" }).setToken(this.config.token); + const rest = new REST().setToken(this.config.token); const commands = []; for (let index = 0; index < folders.length; index++) { const folder = folders[index]; diff --git a/commands/Fun/8ball.js b/commands/Fun/8ball.js new file mode 100644 index 00000000..a996b944 --- /dev/null +++ b/commands/Fun/8ball.js @@ -0,0 +1,53 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Eightball extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("8ball") + .setDescription(client.translate("fun/8ball:DESCRIPTION")) + .addStringOption(option => + option.setName("question") + .setDescription(client.translate("fun/8ball:QUESTION")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + await interaction.deferReply(); + const question = interaction.options.getString("question"); + + if (!question.endsWith("?")) return interaction.replyT("fun/8ball:ERR_QUESTION", null, { ephemeral: true }); + + const answerN = client.functions.randomNum(1, 20); + const answer = interaction.translate(`fun/8ball:RESPONSE_${answerN}`); + await client.wait(2000); + + interaction.editReply({ + content: answer + }); + } +} + +module.exports = Eightball; \ No newline at end of file diff --git a/commands/Fun/lmgtfy.js b/commands/Fun/lmgtfy.js new file mode 100644 index 00000000..742ac26b --- /dev/null +++ b/commands/Fun/lmgtfy.js @@ -0,0 +1,47 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class LMGTFY extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("lmgtfy") + .setDescription(client.translate("fun/lmgtfy:DESCRIPTION")) + .addStringOption(option => + option.setName("question") + .setDescription(client.translate("fun/8ball:QUESTION")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const question = interaction.options.getString("question").replace(/[' '_]/g, "+"); + + interaction.reply({ + content: ``, + ephemeral: true + }); + } +} + +module.exports = LMGTFY; \ No newline at end of file diff --git a/commands/Fun/lovecalc.js b/commands/Fun/lovecalc.js new file mode 100644 index 00000000..65d3f626 --- /dev/null +++ b/commands/Fun/lovecalc.js @@ -0,0 +1,74 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + md5 = require("md5"); + +class Lovecalc extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("lovecalc") + .setDescription(client.translate("fun/lovecalc:DESCRIPTION")) + .addUserOption(option => + option.setName("first_member") + .setDescription(client.translate("common:USER")) + .setRequired(true)) + .addUserOption(option => + option.setName("second_member") + .setDescription(client.translate("common:USER"))), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const firstMember = interaction.options.getMember("first_member"); + const secondMember = interaction.options.getMember("second_member") || interaction.user; + + const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10)); + const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`); + + const string = hash + .split("") + .filter(e => !isNaN(e)) + .join(""); + const percent = parseInt(string.substr(0, 2), 10); + + const embed = new EmbedBuilder() + .setAuthor({ + name: `❤️ ${interaction.translate("fun/lovecalc:DESCRIPTION")}` + }) + .setDescription(interaction.translate("fun/lovecalc:CONTENT", { + percent, + firstMember: firstMember, + secondMember: secondMember + })) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Lovecalc; \ No newline at end of file diff --git a/commands/Fun/memes.js b/commands/Fun/memes.js new file mode 100644 index 00000000..ea635ec8 --- /dev/null +++ b/commands/Fun/memes.js @@ -0,0 +1,81 @@ +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + fetch = require("node-fetch"); + +class Memes extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("memes") + .setDescription(client.translate("fun/memes:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const tags = ["memes", "dankmemes", "me_irl", "wholesomememes"].map(tag => + JSON.parse(JSON.stringify({ + label: tag, + value: tag + })) + ); + + const row = new ActionRowBuilder() + .addComponents( + new SelectMenuBuilder() + .setCustomId("memes_select") + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) + .addOptions(tags) + ); + + const msg = await interaction.reply({ + content: interaction.translate("common:AVAILABLE_CATEGORIES"), + components: [row], + fetchReply: true + }); + + const collector = new InteractionCollector(client, { + message: msg, + idle: 60 * 1000 + }); + + collector.on("collect", async (msg) => { + const tag = msg?.values[0]; + const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); + + const embed = new EmbedBuilder() + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }) + .setTitle(`${res.title}\n${interaction.translate("fun/memes:SUBREDDIT")}: ${res.subreddit}\n${interaction.translate("common:AUTHOR")}: ${res.author}\n${interaction.translate("fun/memes:UPS")}: ${res.ups}`) + .setImage(res.url) + .setTimestamp(); + + msg.update({ + embeds: [embed] + }); + }); + } +} + +module.exports = Memes; \ No newline at end of file diff --git a/commands/General/ping.js b/commands/General/ping.js index 470d6fd7..778f16c5 100644 --- a/commands/General/ping.js +++ b/commands/General/ping.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"); +const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Ping extends BaseCommand { diff --git a/commands/NSFW/nsfw.js b/commands/NSFW/nsfw.js index 2191d2ec..7fed0963 100644 --- a/commands/NSFW/nsfw.js +++ b/commands/NSFW/nsfw.js @@ -1,6 +1,4 @@ - -const { SlashCommandBuilder } = require("@discordjs/builders"), - { MessageEmbed, MessageActionRow, MessageSelectMenu, InteractionCollector } = require("discord.js"); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"), fetch = require("node-fetch"); @@ -39,35 +37,35 @@ class NSFW extends BaseCommand { const tags = ["hentai", "ecchi", "lewdanimegirls", "hentaifemdom", "animefeets", "animebooty", "biganimetiddies", "sideoppai", "ahegao"].map(tag => JSON.parse(JSON.stringify({ label: tag, - description: "", value: tag })) ); - const row = new MessageActionRow() + const row = new ActionRowBuilder() .addComponents( - new MessageSelectMenu() + new SelectMenuBuilder() .setCustomId("nsfw_select") - .setPlaceholder(client.translate("nsfw/nsfw:NOTHING_SELECTED")) + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) .addOptions(tags) ); const msg = await interaction.reply({ - content: interaction.translate("nsfw/nsfw:AVAILABLE_CATEGORIES"), + content: interaction.translate("common:AVAILABLE_CATEGORIES"), ephemeral: true, - components: [row] + components: [row], + fetchReply: true }); const collector = new InteractionCollector(client, { message: msg, - time: 60 * 1000 + idle: 60 * 1000 }); collector.on("collect", async (msg) => { const tag = msg?.values[0]; const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setColor(client.config.embed.color) .setFooter({ text: client.config.embed.footer diff --git a/commands/Owner/debug.js b/commands/Owner/debug.js index 4cdc1085..4b9ef9e7 100644 --- a/commands/Owner/debug.js +++ b/commands/Owner/debug.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"); +const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Debug extends BaseCommand { diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js index 0e1ff34b..d219584b 100644 --- a/commands/Owner/eval.js +++ b/commands/Owner/eval.js @@ -1,5 +1,5 @@ /* eslint-disable no-unused-vars */ -const { SlashCommandBuilder } = require("@discordjs/builders"); +const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Eval extends BaseCommand { @@ -14,7 +14,7 @@ class Eval extends BaseCommand { .setDescription(client.translate("owner/eval:DESCRIPTION")) .addStringOption(option => option.setName("code") - .setDescription(client.translate("owner/eval:USAGE")) + .setDescription(client.translate("owner/eval:CODE")) .setRequired(true)), aliases: [], dirname: __dirname, diff --git a/commands/Owner/reload.js b/commands/Owner/reload.js index 10e48a3c..c04aa4c4 100644 --- a/commands/Owner/reload.js +++ b/commands/Owner/reload.js @@ -1,5 +1,5 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"), - BaseCommand = require("../../base/BaseCommand"), +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), i18next = require("i18next"), autoUpdateDocs = require("../../helpers/autoUpdateDocs"); @@ -15,7 +15,7 @@ class Reload extends BaseCommand { .setDescription(client.translate("owner/reload:DESCRIPTION")) .addStringOption(option => option.setName("command") - .setDescription(client.translate("owner/reload:USAGE")) + .setDescription(client.translate("owner/reload:COMMAND")) .setRequired(true)), aliases: [], dirname: __dirname, diff --git a/commands/Owner/say.js b/commands/Owner/say.js index e13243bf..536e8399 100644 --- a/commands/Owner/say.js +++ b/commands/Owner/say.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"); +const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Say extends BaseCommand { @@ -38,7 +38,7 @@ class Say extends BaseCommand { * @param {Array} data */ async execute(client, interaction) { - interaction.deferReply({ ephemeral: true }); + await interaction.deferReply({ ephemeral: true }); const message = interaction.options.getString("message"); const channel = interaction.options.getChannel("channel"); diff --git a/commands/Owner/servers.js b/commands/Owner/servers.js index 7039000d..26b52970 100644 --- a/commands/Owner/servers.js +++ b/commands/Owner/servers.js @@ -1,5 +1,4 @@ -const { SlashCommandBuilder } = require("@discordjs/builders"), - { MessageEmbed } = require("discord.js"); +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Servers extends BaseCommand { @@ -44,12 +43,11 @@ class Servers extends BaseCommand { .slice(0, 10) .join("\n"); - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: interaction.user.tag, iconURL: interaction.user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) diff --git a/dashboard/routes/discord.js b/dashboard/routes/discord.js index c8d3c344..3d5f606d 100644 --- a/dashboard/routes/discord.js +++ b/dashboard/routes/discord.js @@ -80,7 +80,7 @@ router.get("/callback", async (req, res) => { const userDB = await req.client.findOrCreateUser(req.session.user.id); const logsChannel = req.client.channels.cache.get(req.client.config.dashboard.logs); if (!userDB.logged && logsChannel && user) { - const embed = new Discord.MessageEmbed() + const embed = new Discord.EmbedBuilder() .setAuthor({ name: user.username, iconURL: user.displayAvatarURL() }) .setColor(req.client.config.embed.color) .setDescription(req.client.translate("dashboard:FIRST_LOGIN", { user: user.tag })); diff --git a/dashboard/utils.js b/dashboard/utils.js index 12a75c73..e89d8922 100644 --- a/dashboard/utils.js +++ b/dashboard/utils.js @@ -1,4 +1,4 @@ -const { Permissions } = require("discord.js"); +const { PermissionsBitField } = require("discord.js"); /** * Fetch user informations (stats, guilds, etc...) @@ -12,8 +12,8 @@ async function fetchUser(userData, client, query) { userData.guilds.forEach((guild) => { if (!client.guilds.cache.get(guild.id)) return; // eslint-disable-next-line no-undef - const perms = new Permissions(BigInt(guild.permissions)); - if (perms.has(Permissions.FLAGS.MANAGE_GUILD)) guild.admin = true; + const perms = new PermissionsBitField(BigInt(guild.permissions)); + if (perms.has(PermissionsBitField.Flags.ManageGuild)) guild.admin = true; guild.settingsUrl = (client.guilds.cache.get(guild.id) ? `/manage/${guild.id}/` : `https://discordapp.com/oauth2/authorize?client_id=${client.user.id}&scope=bot&permissions=8&guild_id=${guild.id}`); guild.statsUrl = (client.guilds.cache.get(guild.id) ? `/stats/${guild.id}/` : `https://discordapp.com/oauth2/authorize?client_id=${client.user.id}&scope=bot&permissions=8&guild_id=${guild.id}`); diff --git a/events/CommandHandler.js b/events/CommandHandler.js index fc41f735..21daf30c 100644 --- a/events/CommandHandler.js +++ b/events/CommandHandler.js @@ -1,4 +1,5 @@ const BaseEvent = require("../base/BaseEvent"); +const { InteractionType } = require("discord.js"); class CommandHandler extends BaseEvent { constructor() { @@ -14,7 +15,7 @@ class CommandHandler extends BaseEvent { * @param {import("discord.js").Interaction} interaction */ async execute(client, interaction) { - if (interaction.type !== "APPLICATION_COMMAND" && !interaction.isCommand()) return; + if (interaction.type !== InteractionType.ApplicationCommand && !interaction.isCommand()) return; const command = client.commands.get(interaction.commandName); const data = []; diff --git a/events/Guild/guildCreate.js b/events/Guild/guildCreate.js index 5f8b33f9..d112575a 100644 --- a/events/Guild/guildCreate.js +++ b/events/Guild/guildCreate.js @@ -1,4 +1,4 @@ -const { MessageEmbed } = require("discord.js"), +const { EmbedBuilder } = require("discord.js"), BaseEvent = require("../../base/BaseEvent"); class GuildCreate extends BaseEvent { @@ -31,7 +31,7 @@ class GuildCreate extends BaseEvent { await userData.save(); } - const thanksEmbed = new MessageEmbed() + const thanksEmbed = new EmbedBuilder() .setAuthor({ name: "Спасибо что добавили меня на свой сервер!" }) @@ -49,12 +49,10 @@ class GuildCreate extends BaseEvent { const users = guild.members.cache.filter((m) => !m.user.bot).size; const bots = guild.members.cache.filter((m) => m.user.bot).size; - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: guild.name, - iconURL: guild.iconURL({ - dynamic: true - }) + iconURL: guild.iconURL() }) .setColor("#32CD32") .setDescription(`Зашёл на сервер **${guild.name}**. На нём **${users}** ${this.client.getNoun(users, this.client.translate("misc:NOUNS:USERS:1"), this.client.translate("misc:NOUNS:USERS:2"), this.client.translate("misc:NOUNS:USERS:5"))} (из них **${bots}** ${this.client.getNoun(bots, this.client.translate("misc:NOUNS:BOTS:1"), this.client.translate("misc:NOUNS:BOTS:2"), this.client.translate("misc:NOUNS:BOTS:5"))})`); diff --git a/events/Guild/guildDelete.js b/events/Guild/guildDelete.js index 1cca1466..13ff80bd 100644 --- a/events/Guild/guildDelete.js +++ b/events/Guild/guildDelete.js @@ -1,4 +1,4 @@ -const { MessageEmbed } = require("discord.js"), +const { EmbedBuilder } = require("discord.js"), BaseEvent = require("../../base/BaseEvent"); class GuildDelete extends BaseEvent { @@ -13,12 +13,10 @@ class GuildDelete extends BaseEvent { * @param {import("discord.js").Guild} guild */ async execute(guild) { - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: guild.name, - iconURL: guild.iconURL({ - dynamic: true - }) + iconURL: guild.iconURL() }) .setColor("#B22222") .setDescription(`Вышел с сервера **${guild.name}**.`); diff --git a/events/Guild/guildMemberAdd.js b/events/Guild/guildMemberAdd.js index a227de96..d257cd3e 100644 --- a/events/Guild/guildMemberAdd.js +++ b/events/Guild/guildMemberAdd.js @@ -1,6 +1,6 @@ const Canvas = require("canvas"), BaseEvent = require("../../base/BaseEvent"), - { MessageAttachment } = require("discord.js"), + { AttachmentBuilder } = require("discord.js"), { resolve } = require("path"); // Register assets fonts @@ -139,7 +139,7 @@ class GuildMemberAdd extends BaseEvent { })); ctx.drawImage(avatar, 45, 90, 270, 270); - const attachment = new MessageAttachment(canvas.toBuffer(), "welcome-image.png"); + const attachment = new AttachmentBuilder(canvas.toBuffer(), { name: "welcome-image.png" }); channel.send({ content: message, files: [attachment] diff --git a/events/Guild/guildMemberRemove.js b/events/Guild/guildMemberRemove.js index 45eae983..e0b3427b 100644 --- a/events/Guild/guildMemberRemove.js +++ b/events/Guild/guildMemberRemove.js @@ -1,6 +1,6 @@ const Canvas = require("canvas"), BaseEvent = require("../../base/BaseEvent"), - { MessageAttachment } = require("discord.js"), + { AttachmentBuilder } = require("discord.js"), { resolve } = require("path"); // Register assets fonts @@ -122,7 +122,7 @@ class GuildMemberRemove extends BaseEvent { })); ctx.drawImage(avatar, 45, 90, 270, 270); - const attachment = new MessageAttachment(canvas.toBuffer(), "goodbye-image.png"); + const attachment = new AttachmentBuilder(canvas.toBuffer(), { name: "goodbye-image.png" }); channel.send({ content: message, files: [attachment] diff --git a/events/messageCreate.js b/events/messageCreate.js index e4b709c9..d2bbc708 100644 --- a/events/messageCreate.js +++ b/events/messageCreate.js @@ -1,4 +1,4 @@ -const { Permissions } = require("discord.js"), +const { PermissionsBitField } = require("discord.js"), xpCooldown = {}, BaseEvent = require("../base/BaseEvent"); @@ -54,7 +54,7 @@ class MessageCreate extends BaseEvent { if (data.guild.plugins.automod.enabled && !data.guild.plugins.automod.ignored.includes(message.channel.id)) { if (/(discord\.(gg|io|me|li)\/.+|discordapp\.com\/invite\/.+)/i.test(message.content)) { - if (!message.channel.permissionsFor(message.member).has(Permissions.FLAGS.MANAGE_MESSAGES)) { + if (!message.channel.permissionsFor(message.member).has(PermissionsBitField.Flags.ManageMessages)) { message.delete(); message.author.send("```" + message.content + "```"); return message.error("administration/automod:DELETED", { diff --git a/events/ready.js b/events/ready.js index 754d4b97..2e767ced 100644 --- a/events/ready.js +++ b/events/ready.js @@ -1,5 +1,5 @@ const BaseEvent = require("../base/BaseEvent"), - { Permissions } = require("discord.js"); + { PermissionsBitField } = require("discord.js"); class Ready extends BaseEvent { constructor() { @@ -21,7 +21,7 @@ class Ready extends BaseEvent { // Logs some informations using logger client.logger.log(`Loaded a total of ${commands.length} command(s).`, "ready"); client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready"); - client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [Permissions.FLAGS.ADMINISTRATOR] })}`, "ready"); + client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [ PermissionsBitField.Flags.Administrator ] })}`, "ready"); // Discord Together const discordtogether = require("../helpers/discordTogether"); @@ -56,7 +56,6 @@ class Ready extends BaseEvent { ]; let i = 0; - setTimeout setInterval(async function () { hiddenGuild = await client.guilds.fetch("568120814776614924"); tUsers = client.users.cache.size - hiddenGuild.memberCount; diff --git a/helpers/birthdays.js b/helpers/birthdays.js index 69a95685..0e288e78 100644 --- a/helpers/birthdays.js +++ b/helpers/birthdays.js @@ -1,5 +1,5 @@ const { CronJob } = require("cron"), - { MessageEmbed } = require("discord.js"); + { EmbedBuilder } = require("discord.js"); module.exports.init = async function (client) { new CronJob("0 5 * * *", async function () { @@ -26,12 +26,11 @@ module.exports.init = async function (client) { const age = currentYear - year; if (currentMonth === month && currentDay === day) { - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: client.user.username, iconURL: client.user.displayAvatarURL({ size: 512, - dynamic: true, format: "png" }) }) @@ -39,11 +38,16 @@ module.exports.init = async function (client) { .setFooter({ text: client.config.embed.footer }) - .addField(client.translate("economy/birthdate:HAPPY_BIRTHDAY"), client.translate("economy/birthdate:HAPPY_BIRTHDAY_MESSAGE", { - name: user.username, - user: user.id, - age: `**${age}** ${client.getNoun(age, client.translate("misc:NOUNS:AGE:1"), client.translate("misc:NOUNS:AGE:2"), client.translate("misc:NOUNS:AGE:5"))}` - })); + .addFields([ + { + name: client.translate("economy/birthdate:HAPPY_BIRTHDAY"), + value: client.translate("economy/birthdate:HAPPY_BIRTHDAY_MESSAGE", { + name: user.username, + user: user.id, + age: `**${age}** ${client.getNoun(age, client.translate("misc:NOUNS:AGE:1"), client.translate("misc:NOUNS:AGE:2"), client.translate("misc:NOUNS:AGE:5"))}` + }) + } + ]); const msg = await channel.send({ embeds: [embed] }); diff --git a/helpers/checkReminds.js b/helpers/checkReminds.js index bdc111a7..34f3743c 100644 --- a/helpers/checkReminds.js +++ b/helpers/checkReminds.js @@ -1,4 +1,4 @@ -const { MessageEmbed } = require("discord.js"); +const { EmbedBuilder } = require("discord.js"); module.exports.init = function (client) { client.usersData @@ -18,14 +18,22 @@ module.exports.init = function (client) { const mustSent = reminds.filter((r) => r.sendAt < dateNow); if (mustSent.length > 0) { mustSent.forEach((r) => { - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setAuthor({ name: client.translate("general/remindme:TITLE") }) - .addField(client.translate("common:CREATION"), client.translate("general/remindme:CREATED", { - time: client.convertTime(r.createdAt, "from") - })) - .addField(client.translate("common:MESSAGE"), r.message) + .addFields([ + { + name: client.translate("common:CREATION"), + value: client.translate("general/remindme:CREATED", { + time: client.convertTime(r.createdAt, "from") + }) + }, + { + name: client.translate("common:MESSAGE"), + value: r.message + } + ]) .setColor(client.config.embed.color) .setFooter({ text: client.config.embed.footer diff --git a/helpers/checkUnmutes.js b/helpers/checkUnmutes.js index 9fac0be0..ff48d52a 100644 --- a/helpers/checkUnmutes.js +++ b/helpers/checkUnmutes.js @@ -1,4 +1,4 @@ -const { MessageEmbed } = require("discord.js"); +const { EmbedBuilder } = require("discord.js"); module.exports.init = async function (client) { client.membersData @@ -33,7 +33,7 @@ module.exports.init = async function (client) { }); } const user = member ? member.user : await client.users.fetch(memberData.id); - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setDescription(guild.translate("moderation/unmute:SUCCESS_CASE", { user: user.toString(), usertag: user.tag, diff --git a/helpers/extenders.js b/helpers/extenders.js index 8e061c84..73bfcb2f 100644 --- a/helpers/extenders.js +++ b/helpers/extenders.js @@ -1,4 +1,31 @@ -const { Message, Interaction } = require("discord.js"); +const { Message, CommandInteraction } = require("discord.js"); + +CommandInteraction.prototype.translate = function (key, args) { + const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); + if (!language) throw "Message: Invalid language set in data."; + + return language(key, args); +}; + +CommandInteraction.prototype.replyT = function (key, args, options = {}) { + let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); + if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; + + if (options.edit) return this.editReply({ content: string, ephemeral: options.ephemeral || false }); + else return this.reply({ content: string, ephemeral: options.ephemeral || false }); +}; + +CommandInteraction.prototype.error = function (key, args, options = {}) { + options.prefixEmoji = "error"; + + return this.replyT(key, args, options); +}; + +CommandInteraction.prototype.success = function (key, args, options = {}) { + options.prefixEmoji = "success"; + + return this.replyT(key, args, options); +}; Message.prototype.translate = function (key, args) { const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); @@ -24,32 +51,5 @@ Message.prototype.error = function (key, args, options = {}) { Message.prototype.success = function (key, args, options = {}) { options.prefixEmoji = "success"; - return this.replyT(key, args, options); -}; - -Interaction.prototype.translate = function (key, args) { - const language = this.client.translations.get(this.guild ? this.guild.data.language : "ru-RU"); - if (!language) throw "Message: Invalid language set in data."; - - return language(key, args); -}; - -Interaction.prototype.replyT = function (key, args, options = {}) { - let string = this.translate(key, args, this.guild ? this.guild.data.language : "ru-RU"); - if (options.prefixEmoji) string = `${this.client.customEmojis[options.prefixEmoji]} | ${string}`; - - if (options.edit) return this.editReply({ content: string, ephemeral: options.ephemeral || false }); - else return this.reply({ content: string, ephemeral: options.ephemeral || false }); -}; - -Interaction.prototype.error = function (key, args, options = {}) { - options.prefixEmoji = "error"; - - return this.replyT(key, args, options); -}; - -Interaction.prototype.success = function (key, args, options = {}) { - options.prefixEmoji = "success"; - return this.replyT(key, args, options); }; \ No newline at end of file diff --git a/helpers/functions.js b/helpers/functions.js index 54717c05..738d328f 100644 --- a/helpers/functions.js +++ b/helpers/functions.js @@ -1,4 +1,4 @@ -const { Permissions } = require("discord.js"), +const { PermissionsBitField } = require("discord.js"), langs = require("../languages/language-meta.json").map((l) => l.moment).filter((l) => l !== "en"); langs.forEach((lang) => { require(`moment/locale/${lang}.js`); @@ -7,8 +7,8 @@ langs.forEach((lang) => { module.exports = { async createInvite(client, guildId) { const guild = client.guilds.cache.get(guildId); - const member = guild.me; - const channel = guild.channels.cache.find((ch) => ch.permissionsFor(member.id).has(Permissions.FLAGS.CREATE_INSTANT_INVITE) && ch.type === "GUILD_TEXT" || ch.type === "GUILD_VOICE"); + const member = guild.members.me; + const channel = guild.channels.cache.find((ch) => ch.permissionsFor(member.id).has(PermissionsBitField.Flags.CreateInstantInvite) && ch.type === "GUILD_TEXT" || ch.type === "GUILD_VOICE"); if (channel) { const invite = await channel.createInvite(); diff --git a/helpers/tictactoe.js b/helpers/tictactoe.js index 92ac9f1a..44b80f5d 100644 --- a/helpers/tictactoe.js +++ b/helpers/tictactoe.js @@ -1,6 +1,6 @@ // Thanks to simply-djs for this =) -const { MessageEmbed, MessageButton, MessageActionRow } = require("discord.js"); +const { EmbedBuilder, ButtonBuilder, ActionRowBuilder, ButtonStyle } = require("discord.js"); /** * @param {require("discord.js").Message} message @@ -66,7 +66,7 @@ async function tictactoe(interaction, options = {}) { const foot = options.embedFoot ? { text: options.embedFoot } : { text: "Удачи =)" }; - const acceptEmbed = new MessageEmbed() + const acceptEmbed = new EmbedBuilder() .setTitle(interaction.translate("economy/tictactoe:REQUEST_WAIT", { user: opponent.tag })) @@ -78,17 +78,17 @@ async function tictactoe(interaction, options = {}) { .setFooter(foot) .setTimestamp(); - const accept = new MessageButton() + const accept = new ButtonBuilder() .setLabel(interaction.translate("economy/tictactoe:ACCEPT")) .setStyle("SUCCESS") .setCustomId("acceptttt"); - const decline = new MessageButton() + const decline = new ButtonBuilder() .setLabel(interaction.translate("economy/tictactoe:DECLINE")) .setStyle("DANGER") .setCustomId("declinettt"); - const accep = new MessageActionRow().addComponents([ + const accep = new ActionRowBuilder().addComponents([ accept, decline ]); @@ -145,54 +145,54 @@ async function tictactoe(interaction, options = {}) { const Args = { user: 0, a1: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, a2: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, a3: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, b1: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, b2: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, b3: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, c1: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, c2: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false }, c3: { - style: "SECONDARY", + style: ButtonStyle.Secondary, emoji: dashmoji, disabled: false } }; - const { MessageActionRow, MessageButton } = require("discord.js"); + const { ActionRowBuilder, ButtonBuilder } = require("discord.js"); - const epm = new MessageEmbed() + const epm = new EmbedBuilder() .setTitle(interaction.translate("economy/tictactoe:DESCRIPTION")) .setColor(options.embedColor || "#075FFF") .setFooter(foot) @@ -233,54 +233,54 @@ async function tictactoe(interaction, options = {}) { "<:X_:863314044781723668>": false }; - const a1 = new MessageButton() + const a1 = new ButtonBuilder() .setStyle(Args.a1.style) .setEmoji(Args.a1.emoji) .setCustomId("a1") .setDisabled(Args.a1.disabled); - const a2 = new MessageButton() + const a2 = new ButtonBuilder() .setStyle(Args.a2.style) .setEmoji(Args.a2.emoji) .setCustomId("a2") .setDisabled(Args.a2.disabled); - const a3 = new MessageButton() + const a3 = new ButtonBuilder() .setStyle(Args.a3.style) .setEmoji(Args.a3.emoji) .setCustomId("a3") .setDisabled(Args.a3.disabled); - const b1 = new MessageButton() + const b1 = new ButtonBuilder() .setStyle(Args.b1.style) .setEmoji(Args.b1.emoji) .setCustomId("b1") .setDisabled(Args.b1.disabled); - const b2 = new MessageButton() + const b2 = new ButtonBuilder() .setStyle(Args.b2.style) .setEmoji(Args.b2.emoji) .setCustomId("b2") .setDisabled(Args.b2.disabled); - const b3 = new MessageButton() + const b3 = new ButtonBuilder() .setStyle(Args.b3.style) .setEmoji(Args.b3.emoji) .setCustomId("b3") .setDisabled(Args.b3.disabled); - const c1 = new MessageButton() + const c1 = new ButtonBuilder() .setStyle(Args.c1.style) .setEmoji(Args.c1.emoji) .setCustomId("c1") .setDisabled(Args.c1.disabled); - const c2 = new MessageButton() + const c2 = new ButtonBuilder() .setStyle(Args.c2.style) .setEmoji(Args.c2.emoji) .setCustomId("c2") .setDisabled(Args.c2.disabled); - const c3 = new MessageButton() + const c3 = new ButtonBuilder() .setStyle(Args.c3.style) .setEmoji(Args.c3.emoji) .setCustomId("c3") .setDisabled(Args.c3.disabled); - const a = new MessageActionRow().addComponents([a1, a2, a3]); - const b = new MessageActionRow().addComponents([b1, b2, b3]); - const c = new MessageActionRow().addComponents([c1, c2, c3]); + const a = new ActionRowBuilder().addComponents([a1, a2, a3]); + const b = new ActionRowBuilder().addComponents([b1, b2, b3]); + const c = new ActionRowBuilder().addComponents([c1, c2, c3]); const buttons = [a, b, c]; if ( @@ -688,14 +688,14 @@ async function tictactoe(interaction, options = {}) { if (Args.user == 0) { Args.user = 1; Args[b.customId] = { - style: "SUCCESS", + style: ButtonStyle.Success, emoji: o_emoji, disabled: true }; } else { Args.user = 0; Args[b.customId] = { - style: "DANGER", + style: ButtonStyle.Danger, emoji: x_emoji, disabled: true }; @@ -838,7 +838,7 @@ async function tictactoe(interaction, options = {}) { collector.on("end", (collected, reason) => { if (reason == "time") { - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setTitle(interaction.translate("economy/tictactoe:NO_ANSWER_TITLE")) .setAuthor({ name: (interaction.user ? interaction.user : interaction.author).tag, @@ -857,7 +857,7 @@ async function tictactoe(interaction, options = {}) { }); } if (reason == "decline") { - const embed = new MessageEmbed() + const embed = new EmbedBuilder() .setTitle(interaction.translate("economy/tictactoe:CANCELED")) .setAuthor({ name: (interaction.user ? interaction.user : interaction.author).tag, diff --git a/index.js b/index.js index 129185de..7a4095c7 100644 --- a/index.js +++ b/index.js @@ -1,10 +1,10 @@ require("./helpers/extenders"); -const { Intents } = require("discord.js"), +const { GatewayIntentBits } = require("discord.js"), JaBa = require("./base/JaBa"); const client = new JaBa({ - intents: Object.keys(Intents.FLAGS), + intents: [ GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers, GatewayIntentBits.GuildBans, GatewayIntentBits.GuildEmojisAndStickers, GatewayIntentBits.GuildIntegrations, GatewayIntentBits.GuildInvites, GatewayIntentBits.GuildVoiceStates, GatewayIntentBits.GuildPresences, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions, GatewayIntentBits.GuildMessageTyping, GatewayIntentBits.MessageContent ], allowedMentions: { parse: ["everyone", "roles", "users"] } }); @@ -17,7 +17,7 @@ const client = new JaBa({ })(); client.on("disconnect", () => client.logger.log("Bot is disconnecting...", "warn")) - .on("reconnecting", () => client.logger.log("Bot reconnecting...", "log")) + .on("reconnecting", () => client.logger.log("Bot reconnecting...", "warn")) .on("error", (e) => client.logger.log(e, "error")) .on("warn", (info) => client.logger.log(info, "warn")); process.on("unhandledRejection", (err) => console.error(err)); \ No newline at end of file diff --git a/languages/ru-RU/administration/backup.json b/languages/ru-RU/administration/backup.json deleted file mode 100644 index 7fdedb7f..00000000 --- a/languages/ru-RU/administration/backup.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "DESCRIPTION": "Управление резервными копиями сервера!", - "USAGE": "backup [create/load/info/remove]", - "EXAMPLES": "backup create\nbackup load 123456789098765432\nbackup info 123456789098765432", - "MISSING_STATUS": "Выберите действие: `create`, `load`, `info` или `remove`!", - "MISSING_BACKUP_ID": "Укажите ID резервной копии!", - "NO_BACKUP_FOUND": "Резервных копий с ID `{{backupID}}` не найдено", - "SUCCESS_PUBLIC": "Резервная копия успешно создана! ID резервной копии был отправлен вам в ЛС!", - "SUCCESS_PRIVATE": "Вот ID вашей резервной копии: **`{{backupID}}`**, используйте его для восстановления на другом сервере!", - "CONFIRMATION": ":warning: | **Загрузка резервной копии заменит настройки текущего сервера.**\n\n:arrow_right_hook: *Отправьте `да` для подтверждения!*", - "REMOVE_CONFIRMATION": ":warning: | **Вы уверены что хотите удалить резервную копию? Это действие необратимо**\n\n:arrow_right_hook: *Отправьте `да` для подтверждения!*", - "SUCCESS_REMOVED": "Резервная копия успешно удалена!", - "START_LOADING": "Загрузка резервной копии начата, подождите!", - "LOAD_SUCCESS": "Резервная копия загружена!", - "TITLE_INFO": "Информация о резервной копии", - "TITLE_ID": "ID", - "TITLE_SERVER_ID": "ID сервера", - "TITLE_SIZE": "Размер", - "TITLE_CREATED_AT": "Создана" -} \ No newline at end of file diff --git a/languages/ru-RU/common.json b/languages/ru-RU/common.json index 615024c2..c0660f92 100644 --- a/languages/ru-RU/common.json +++ b/languages/ru-RU/common.json @@ -58,6 +58,8 @@ "MODLOGS": "Логи модерации", "NO_CHANNEL": "Канал не выбран", "REPORTS": "Жалобы", - "BIRTHDAYS": "Поздравления с днём рождения", - "DISCONNECT": "Отключить" + "UNKNOWN": "Неизвестно", + "NOTHING_SELECTED": "Ничего не выбрано", + "AVAILABLE_CATEGORIES": "Доступные категории:", + "BIRTHDAYS": "Поздравления с днём рождения" } \ No newline at end of file diff --git a/languages/ru-RU/fun/8ball.json b/languages/ru-RU/fun/8ball.json index 3da81eb7..a743f73d 100644 --- a/languages/ru-RU/fun/8ball.json +++ b/languages/ru-RU/fun/8ball.json @@ -1,8 +1,8 @@ { - "DESCRIPTION": "Я говорю правду!", - "USAGE": "8ball [вопрос?]", + "DESCRIPTION": "Я говорю правду", + "QUESTION": "Вопрос", "EXAMPLES": "8ball JaBa крутой?", - "ERR_QUESTION": "Введите вопрос!", + "ERR_QUESTION": "Вопрос должен оканчиваться на `?`.", "RESPONSE_1": "Бесспорно", "RESPONSE_2": "Предрешено", "RESPONSE_3": "Никаких сомнений", diff --git a/languages/ru-RU/fun/flip.json b/languages/ru-RU/fun/flip.json deleted file mode 100644 index fb837aed..00000000 --- a/languages/ru-RU/fun/flip.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Подкинуть монетку!", - "USAGE": "flip", - "EXAMPLES": "flip", - "HEADS": ":coin: | Орёл!", - "TAILS": ":coin: | Решка!" -} \ No newline at end of file diff --git a/languages/ru-RU/fun/lmg.json b/languages/ru-RU/fun/lmgtfy.json similarity index 61% rename from languages/ru-RU/fun/lmg.json rename to languages/ru-RU/fun/lmgtfy.json index 2be474b4..2a337bab 100644 --- a/languages/ru-RU/fun/lmg.json +++ b/languages/ru-RU/fun/lmgtfy.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Создать LMGTFY (давай я загуглю это для тебя) ссылку", - "USAGE": "lmg [запрос]", - "EXAMPLES": "lmg Как создать Discord бота?", + "USAGE": "lmgtfy [запрос]", + "EXAMPLES": "lmgtfy Как создать Discord бота?", "MISSING": "Укажите запрос!" } \ No newline at end of file diff --git a/languages/ru-RU/fun/lovecalc.json b/languages/ru-RU/fun/lovecalc.json index 2b3deda6..a68808bd 100644 --- a/languages/ru-RU/fun/lovecalc.json +++ b/languages/ru-RU/fun/lovecalc.json @@ -2,6 +2,5 @@ "DESCRIPTION": "Калькулятор любви", "USAGE": "lovecalc [@пользователь1] (@пользователь2)", "EXAMPLES": "lovecalc @Jonny_Bro#4226\nlovecalc @Jonny_Bro#4226 @JaBa#9042", - "MISSING": "Вы должны упомянуть одного или двух пользователей!", - "CONTENT": "Я думаю, что **{{firstUsername}}** на **{{percent}}%** любит **{{secondUsername}}**!" + "CONTENT": "**{{firstMember}}** любит **{{secondMember}}** на **{{percent}}%**!" } \ No newline at end of file diff --git a/languages/ru-RU/fun/memes.json b/languages/ru-RU/fun/memes.json index 347ddfbf..167d8112 100644 --- a/languages/ru-RU/fun/memes.json +++ b/languages/ru-RU/fun/memes.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Получить мем с выбранного или случайного сабреддита", + "DESCRIPTION": "Получить мем с выбранного сабреддита", "USAGE": "memes (тег)", "EXAMPLES": "memes\nmemes me_irl", "SEARCHING": "Ищу мем по тегу `{{tag}}`...", diff --git a/languages/ru-RU/general/invite.json b/languages/ru-RU/general/invite.json deleted file mode 100644 index 135c88c2..00000000 --- a/languages/ru-RU/general/invite.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DESCRIPTION": "Получить ссылку на приглашение JaBa!", - "USAGE": "invite (copy)", - "EXAMPLES": "invite\ninvite copy", - "LINKS": "Ссылки JaBa", - "CLICK": "[**Тык**]({{link}})", - "TIP": "Отправьте `invite copy`, чтобы получить ссылку для копирования!", - "ADD": "Пригласить JaBa", - "SUPPORT": "Поддержать разработчика" -} \ No newline at end of file diff --git a/languages/ru-RU/general/invites.json b/languages/ru-RU/general/invites.json deleted file mode 100644 index bda3b9a2..00000000 --- a/languages/ru-RU/general/invites.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "DESCRIPTION": "Показать кол-во пользователей которых пользователь пригласил на сервер!", - "USAGE": "invites (@пользователь)", - "EXAMPLES": "invites\ninvites @Jonny_Bro#4226", - "NOBODY_AUTHOR": "Вы никого не пригласили на сервер!", - "NOBODY_MEMBER": "{{member}} никого не приглашал(а) на сервер!", - "CODE": "**{{code}}** ({{uses}} использований) | {{channel}}", - "TITLE": "Информация о {{member}} на сервере {{guild}}", - "FIELD_INVITED": "👥 Приглашённых участников", - "FIELD_CODES": "🔑 Коды", - "FIELD_MEMBERS": "{{total}} участников", - "TRACKER": "Отслеживание приглашений" -} \ No newline at end of file diff --git a/languages/ru-RU/general/translate.json b/languages/ru-RU/general/translate.json deleted file mode 100644 index 02d82c7d..00000000 --- a/languages/ru-RU/general/translate.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Перевести текст!", - "USAGE": "translate [язык] [текст]", - "EXAMPLES": "translate english Как дела?", - "LIST_SENT": "Список языков отправлен вам в ЛС!", - "MISSING_LANGUAGE": "Укажите язык! Чтобы получить список языков, введите `translate langs-list`!", - "INVALID_LANGUAGE": "Язык `{{search}}` не найден! Чтобы получить список языков, введите `translate langs-list`!", - "MISSING_CONTENT": "Введите текст!" -} \ No newline at end of file diff --git a/languages/ru-RU/misc.json b/languages/ru-RU/misc.json index 60f9138c..c99c8b93 100644 --- a/languages/ru-RU/misc.json +++ b/languages/ru-RU/misc.json @@ -1,6 +1,5 @@ { "ERR_OCCURRED": "Что-то пошло не так... Попробуйте позже!", - "PLEASE_WAIT": "Подождите...", "COMMAND_DISABLED": "Эта команда на данный момент отключена!", "CLICK_HERE": "Нажмите сюда, чтобы начать {{activity}} в {{channel}}", "TIMES_UP": "Время вышло! Используйте команду снова!", @@ -26,51 +25,6 @@ "COOLDOWNED": "Подождите **{{seconds}}**, чтобы снова использовать эту команду!", "CANNOT_DM": "Я не могу отправить вам личное сообщение... Проверьте свои настройки конфиденциальности!", - "PERMISSIONS": { - "CREATE_INSTANT_INVITE": "Создание приглашения", - "KICK_MEMBERS": "Выгонять участников", - "BAN_MEMBERS": "Банить участников", - "ADMINISTRATOR": "Администратор", - "MANAGE_CHANNELS": "Управлять каналами", - "MANAGE_GUILD": "Управлять сервером", - "ADD_REACTIONS": "Добавлять реакции", - "VIEW_AUDIT_LOG": "Просматривать журнал аудита", - "PRIORITY_SPEAKER": "Приоритетный режим", - "STREAM": "Видео", - "VIEW_CHANNEL": "Просматривать каналы", - "SEND_MESSAGES": "Отправлять сообщения", - "SEND_TTS_MESSAGES": "Отправка сообщений text-to-speech", - "MANAGE_MESSAGES": "Управлять сообщениями", - "EMBED_LINKS": "Встраивать ссылки", - "ATTACH_FILES": "Прикреплять файлы", - "READ_MESSAGE_HISTORY": "Читать историю сообщений", - "MENTION_EVERYONE": "Упоминание *@*everyone, *@*here и всех ролей", - "USE_EXTERNAL_EMOJIS": "Использовать внешние эмодзи", - "VIEW_GUILD_INSIGHTS": "Просматривать статистику сервера", - "CONNECT": "Подключаться", - "SPEAK": "Говорить", - "MUTE_MEMBERS": "Отключать участникам микрофон", - "DEAFEN_MEMBERS": "Отключать участникам звук", - "MOVE_MEMBERS": "Перемещать участников", - "USE_VAD": "Использовать режим активации по голосу", - "CHANGE_NICKNAME": "Изменить никнейм", - "MANAGE_NICKNAMES": "Управлять никнеймами", - "MANAGE_ROLES": "Управлять ролями", - "MANAGE_WEBHOOKS": "Управлять вебхуками (webhooks)", - "MANAGE_EMOJIS_AND_STICKERS": "Управлять эмодзи и стикерами", - "USE_APPLICATION_COMMANDS": "Использовать команды приложения", - "MANAGE_EVENTS": "Управление событиями", - "MANAGE_THREADS": "Управление ветками", - "USE_PUBLIC_THREADS": "Использовать публичные ветки", - "CREATE_PUBLIC_THREADS": "Создать публичные ветки", - "USE_PRIVATE_THREADS": "Использование приватных веток", - "CREATE_PRIVATE_THREADS": "Создание приватных веток", - "USE_EXTERNAL_STICKERS": "Использовать внешние стикеры", - "SEND_MESSAGES_IN_THREADS": "Отправлять сообщения в ветках", - "START_EMBEDDED_ACTIVITIES": "Начать активность", - "MODERATE_MEMBERS": "Отправить участников подумать о своём поведении" - }, - "NOUNS": { "CREDIT": { "1": "кредит", diff --git a/languages/ru-RU/moderation/ban.json b/languages/ru-RU/moderation/ban.json deleted file mode 100644 index b99fc6f9..00000000 --- a/languages/ru-RU/moderation/ban.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "DESCRIPTION": "Забанить пользователя на сервере!", - "USAGE": "ban [@пользователь] (причина)", - "EXAMPLES": "ban @Jonny_Bro#4226 Спам", - "MISSING_MEMBER": "Вы должны упомянуть пользователя!", - "YOURSELF": "Вы не можете забанить себя!", - "SUPERIOR": "Вы не можете сделать это, т.к. пользователь стоит выше вас по роли!", - "ALREADY_BANNED": "**{{username}}** уже в бане!", - "MISSING_PERM": "Произошла ошибка... Проверьте, есть ли у вас право банить пользователей и попробуйте снова!", - "BANNED_DM": "Привет {{username}},\nвы были забанены на сервере **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!", - "BANNED": "**{{username}}** был забанен на сервере **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!", - "CASE": "Бан | Номер #{{count}}" -} \ No newline at end of file diff --git a/languages/ru-RU/moderation/kick.json b/languages/ru-RU/moderation/kick.json deleted file mode 100644 index 9c0b9769..00000000 --- a/languages/ru-RU/moderation/kick.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "DESCRIPTION": "Кикнуть пользователя!", - "USAGE": "kick [@пользователь] (причина)", - "EXAMPLES": "kick @Jonny_Bro#4226 Спам", - "MISSING_MEMBER": "Вы должны упомянуть пользователя!", - "YOURSELF": "Вы не можете кикнуть себя!", - "MISSING_PERM": "Произошла ошибка... Проверьте, есть ли у вас право кикать пользователей и попробуйте снова!", - "KICKED_DM": "Привет {{username}},\nвы были кикнуты с сервера **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!", - "KICKED": "**{{username}}** был кикнут с сервера **{{server}}** пользователем **{{moderator}}** по причине **{{reason}}**!", - "CASE": "Кик | Номер #{{count}}" -} \ No newline at end of file diff --git a/languages/ru-RU/moderation/mute.json b/languages/ru-RU/moderation/mute.json deleted file mode 100644 index 4b9e55a7..00000000 --- a/languages/ru-RU/moderation/mute.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DESCRIPTION": "Запретить пользователю писать сообщения и заходить в голосовые каналы!", - "USAGE": "mute [@пользователь] [время] (причина)", - "EXAMPLES": "mute @Jonny_Bro#4226 24h Спам", - "MISSING_MEMBER": "Вы должны упомянуть пользователя!", - "YOURSELF": "Вы не можете замутить себя!", - "MUTED_DM": "Привет {{username}},\nвы были замучены на сервере **{{server}}** пользователем **{{moderator}}** на **{{time}}** по причине **{{reason}}**!", - "MUTED": "**{{username}}** замучен на **{{time}}** по причине **{{reason}}**!", - "CASE": "Мут | Номер #{{count}}" -} \ No newline at end of file diff --git a/languages/ru-RU/moderation/unmute.json b/languages/ru-RU/moderation/unmute.json deleted file mode 100644 index 9c7a2477..00000000 --- a/languages/ru-RU/moderation/unmute.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Размутить пользователя!", - "USAGE": "unmute [@пользователь]", - "EXAMPLES": "unmute @Jonny_Bro#4226", - "MISSING_MEMBER": "Вы должны упомянуть пользователя!", - "NOT_MUTED": "**{{username}}** не замучен на данном сервере!", - "SUCCESS": "**{{username}}** был размучен на данном сервере!", - "SUCCESS_CASE": "{{user}} (`{{usertag}}`) размучен! (Номер #{{count}})" -} \ No newline at end of file diff --git a/languages/ru-RU/nsfw/nsfw.json b/languages/ru-RU/nsfw/nsfw.json index 711d8c6d..ded013b6 100644 --- a/languages/ru-RU/nsfw/nsfw.json +++ b/languages/ru-RU/nsfw/nsfw.json @@ -2,7 +2,5 @@ "DESCRIPTION": "Найти NSFW изображение по тэгу", "USAGE": "nsfw", "EXAMPLES": "nsfw", - "AVAILABLE_CATEGORIES": "Доступные категории:", - "NOTHING_SELECTED": "Ничего не выбрано", "TAG": "Тэг" } \ No newline at end of file diff --git a/languages/ru-RU/owner/eval.json b/languages/ru-RU/owner/eval.json index 42dd44a8..55beb91b 100644 --- a/languages/ru-RU/owner/eval.json +++ b/languages/ru-RU/owner/eval.json @@ -1,5 +1,5 @@ { "DESCRIPTION": "Выполнить код", - "USAGE": "[код]", + "CODE": "Выполняемый код", "EXAMPLES": "eval interaction.channel.send({ content: \"Hello World!\" })" } \ No newline at end of file diff --git a/languages/ru-RU/owner/reload.json b/languages/ru-RU/owner/reload.json index 879868c0..47d5aba5 100644 --- a/languages/ru-RU/owner/reload.json +++ b/languages/ru-RU/owner/reload.json @@ -1,6 +1,6 @@ { "DESCRIPTION": "Перезагрузить команду!", - "USAGE": "reload", + "COMMAND": "Команда", "EXAMPLES": "reload help", "NOT_FOUND": "Команды `{{search}}` не существует!", "SUCCESS": "Команда `{{command}}` успешно перезагружена!" diff --git a/languages/uk-UA/misc.json b/languages/uk-UA/misc.json index e4194d45..d1107569 100644 --- a/languages/uk-UA/misc.json +++ b/languages/uk-UA/misc.json @@ -27,51 +27,6 @@ "COOLDOWNED": "Зачекайте **{{seconds}}**, щоб знову використати цю команду!", "CANNOT_DM": "Я не можу надіслати вам особисте повідомлення... Перевірте налаштування конфіденційності!", - "PERMISSIONS": { - "CREATE_INSTANT_INVITE": "Створення запрошення", - "KICK_MEMBERS": "Виганяти учасників", - "BAN_MEMBERS": "Банити учасників", - "ADMINISTRATOR": "Адміністратор", - "MANAGE_CHANNELS": "Керувати каналами", - "MANAGE_GUILD": "Керувати сервером", - "ADD_REACTIONS": "Додавати реакції", - "VIEW_AUDIT_LOG": "Перегляд журналу аудиту", - "PRIORITY_SPEAKER": "Пріоритетний режим", - "STREAM": "Відео", - "VIEW_CHANNEL": "Перегляд каналів", - "SEND_MESSAGES": "Надсилати повідомлення", - "SEND_TTS_MESSAGES": "Надсилання повідомлень text-to-speech", - "MANAGE_MESSAGES": "Керувати повідомленнями", - "EMBED_LINKS": "Вбудовувати посилання", - "ATTACH_FILES": "Прикріплювати файли", - "READ_MESSAGE_HISTORY": "Читати історію повідомлень", - "MENTION_EVERYONE": "Згадка *@*everyone, *@*here та всіх ролей", - "USE_EXTERNAL_EMOJIS": "Використовувати зовнішні емодзі", - "VIEW_GUILD_INSIGHTS": "Перегляд статистики сервера", - "CONNECT": "Підключатися", - "SPEAK": "Говорити", - "MUTE_MEMBERS": "Вимкнути учасникам мікрофон", - "DEAFEN_MEMBERS": "Вимкнути учасникам звук", - "MOVE_MEMBERS": "Переміщувати учасників", - "USE_VAD": "Використовувати режим активації за голосом", - "CHANGE_NICKNAME": "Змінити нікнейм", - "MANAGE_NICKNAMES": "Керувати нікнеймами", - "MANAGE_ROLES": "Керувати ролями", - "MANAGE_WEBHOOKS": "Керувати вебхуками (webhooks)", - "MANAGE_EMOJIS_AND_STICKERS": "Керувати емодзі та стікерами", - "USE_APPLICATION_COMMANDS": "Використовувати команди програми", - "MANAGE_EVENTS": "Управління подіями", - "MANAGE_THREADS": "Керування гілками", - "USE_PUBLIC_THREADS": "Використовувати публічні гілки", - "CREATE_PUBLIC_THREADS": "Створити публічні гілки", - "USE_PRIVATE_THREADS": "Використання приватних гілок", - "CREATE_PRIVATE_THREADS": "Створення приватних гілок", - "USE_EXTERNAL_STICKERS": "Використовувати зовнішні стікери", - "SEND_MESSAGES_IN_THREADS": "Надсилати повідомлення у гілках", - "START_EMBEDDED_ACTIVITIES": "Почати активність", - "MODERATE_MEMBERS": "Надіслати учасників подумати про свою поведінку" - }, - "NOUNS": { "CREDIT": { "1": "кредит", diff --git a/package-lock.json b/package-lock.json index beeda0de..a4d2dcb1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,15 +9,13 @@ "version": "TEST", "license": "ISC", "dependencies": { - "@discordjs/builders": "^1.0.0", - "@discordjs/opus": "^0.7.0", + "@discordjs/opus": "^0.8.0", "@discordjs/rest": "^1.0.0", - "@discordjs/voice": "^0.10.0", + "@discordjs/voice": "^0.11.0", "@distube/soundcloud": "^1.2.1", "@distube/spotify": "^1.3.2", "@distube/yt-dlp": "^1.1.3", "@distube/ytdl-core": "^4.11.3", - "@k3rn31p4nic/google-translate-api": "github:k3rn31p4nic/google-translate-api", "@sindresorhus/slugify": "^1.1.0", "amethyste-api": "github:Androz2091/amethyste-api", "btoa": "^1.2.1", @@ -26,31 +24,25 @@ "chalk": "^4.1.0", "colors-generator": "^0.3.4", "cron": "^1.7.2", - "dblapi.js": "^2.3.0", - "discord-api-types": "^0.36.3", - "discord-backup": "^3.2.1", - "discord-giveaways": "github:Androz2091/discord-giveaways#develop", - "discord-paginationembed": "github:gazmull/discord-paginationembed#v3", + "customizable-discordjs-pagination": "^1.3.1", + "discord-api-types": "^0.37.0", + "discord-giveaways": "^6.0.0", "discord-together": "^1.3.3", - "discord.js": "^13.8.1", - "distube": "^3.3.4", + "discord.js": "^14.1.1", + "distube": "^4.0.3", "ejs": "^3.1.3", "express": "^4.17.1", "express-session": "^1.17.0", "ffmpeg-static": "^4.4.0", - "figlet": "^1.5.0", "gamedig": "^4.0.2", "i18next": "^20.2.2", "i18next-node-fs-backend": "^2.1.3", - "js-string-cleaner": "^1.0.3", - "libsodium-wrappers": "^0.7.9", "markdown-table": "2.0.0", "mathjs": "^9.0.0", "md5": "^2.2.1", "moment": "^2.26.0", "mongoose": "^5.13.14", - "ms": "^2.1.3", - "string-sanitizer": "^1.1.1" + "ms": "^2.1.3" }, "devDependencies": { "eslint": "^7.5.0" @@ -198,12 +190,12 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.0.0.tgz", - "integrity": "sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.1.0.tgz", + "integrity": "sha512-EO8TSltiIc9Z1wE854wAFvv5AccqEtvjFmao9PPoxQhRaJ0hEb7FwWRTCA1jGg4ZWI3hcp4m+RET5ufZQz3rOg==", "dependencies": { "@sapphire/shapeshift": "^3.5.1", - "discord-api-types": "^0.36.2", + "discord-api-types": "^0.36.3", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" @@ -212,23 +204,28 @@ "node": ">=16.9.0" } }, + "node_modules/@discordjs/builders/node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, "node_modules/@discordjs/collection": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", - "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.1.tgz", + "integrity": "sha512-5V/wswzR3r2RVYXLxxg4TvrAnBhVCNgHTXhC+OUtLoriJ072rPMHo+Iw1SS1vrCckp8Es40XM411+WkNRPaXFw==", "engines": { "node": ">=16.9.0" } }, "node_modules/@discordjs/node-pre-gyp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", - "integrity": "sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.4.tgz", + "integrity": "sha512-x569MMtdk6jdGo2S58iiZoyv4p/N2Ju8Nh6vvzZb1wyouV7IE3VuU0hg2kqUmTfD0z6r4uD6acvMTuc+iA3f8g==", "dependencies": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", @@ -239,64 +236,93 @@ "node-pre-gyp": "bin/node-pre-gyp" } }, + "node_modules/@discordjs/node-pre-gyp/node_modules/detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "engines": { + "node": ">=8" + } + }, "node_modules/@discordjs/opus": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.7.0.tgz", - "integrity": "sha512-3Xxa3dh7taSDwBAR5fLALZ/KTxvbMmHCMxYLYve6NlPO7Ms1CLmKqp/R4ZoVzkRGQVUVWEhaB1s0v9jfa2tfDg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.8.0.tgz", + "integrity": "sha512-uHE7OmHEmP8YM0yvsH3iSdacdeghO0qTkF0CIkV07Tg0qdyOLUVkoZHj5Zcpge9rC4qb/JvTS2xRgttSZLM43Q==", "hasInstallScript": true, "dependencies": { - "@discordjs/node-pre-gyp": "^0.4.2", - "node-addon-api": "^4.2.0" + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" }, "engines": { "node": ">=12.0.0" } }, "node_modules/@discordjs/rest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.0.tgz", - "integrity": "sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.1.tgz", + "integrity": "sha512-w08CTKVzzYYvKxEjXKOs9AdS7KQ1J502TrPfF8eCZ2lF6AfKuMP/32YgDakiwIyYTDjEQS/v0nKLSFcncHRMtg==", "dependencies": { - "@discordjs/collection": "^1.0.0", + "@discordjs/collection": "^1.0.1", "@sapphire/async-queue": "^1.3.2", "@sapphire/snowflake": "^3.2.2", - "discord-api-types": "^0.36.2", - "file-type": "^17.1.2", + "discord-api-types": "^0.36.3", + "file-type": "^17.1.4", "tslib": "^2.4.0", - "undici": "^5.7.0" + "undici": "^5.8.0" }, "engines": { "node": ">=16.9.0" } }, - "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.0.tgz", - "integrity": "sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q==", - "engines": { - "node": ">=16.9.0" - } + "node_modules/@discordjs/rest/node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" }, "node_modules/@discordjs/voice": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.10.0.tgz", - "integrity": "sha512-tChDKRRbKwWHcyq1dSEzrnuCMJyLtKXcFhgQpqcS2YjZ1TLlXboc/mhrR8jA1Yb1rB81u8dgj/lPkkHsk0ItEg==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz", + "integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==", "dependencies": { "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "prism-media": "^1.3.2", - "tiny-typed-emitter": "^2.1.0", + "discord-api-types": "^0.36.2", + "prism-media": "^1.3.4", "tslib": "^2.4.0", - "ws": "^8.7.0" + "ws": "^8.8.1" }, "engines": { "node": ">=16.9.0" } }, "node_modules/@discordjs/voice/node_modules/discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "node_modules/@discordjs/voice/node_modules/prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "peerDependencies": { + "@discordjs/opus": "^0.8.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", + "node-opus": "^0.3.3", + "opusscript": "^0.0.8" + }, + "peerDependenciesMeta": { + "@discordjs/opus": { + "optional": true + }, + "ffmpeg-static": { + "optional": true + }, + "node-opus": { + "optional": true + }, + "opusscript": { + "optional": true + } + } }, "node_modules/@distube/soundcloud": { "version": "1.2.1", @@ -323,25 +349,6 @@ "distube": "^3.3.1||4" } }, - "node_modules/@distube/youtube-dl": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@distube/youtube-dl/-/youtube-dl-2.2.4.tgz", - "integrity": "sha512-rGmnVqNF6LjGb5zpSLicLgeK9MbIJ/wOJ6Zl5g9V44Cnfkxfk76VNtzd9wNp3JPdWPa9aD9HUsMA4H72Z9ZoiQ==", - "hasInstallScript": true, - "dependencies": { - "dargs": "~7.0.0", - "execa": "~5.1.1", - "get-stream": "~6.0.1", - "got": "~11.8.2", - "is-unix": "~1.0.0", - "mkdirp": "~1.0.4", - "p-event": "~4.2.0", - "p-reflect": "~2.1.0" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/@distube/yt-dlp": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@distube/yt-dlp/-/yt-dlp-1.1.3.tgz", @@ -385,11 +392,11 @@ } }, "node_modules/@distube/ytsr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.5.tgz", - "integrity": "sha512-nSYsB+UYw0FXSivJ49MGkES41Gfg5rgavil9nOHra0yCsGiY4qsDzpoFVjCmbpKQ6GDUq4Z/8LOwZakgpH3N1A==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.8.tgz", + "integrity": "sha512-/6pVd9Hiu6EbjPbbC4PKckse957LMiCYYwULWH7Ctovbc/mdPz9pT7hsFIBqx1vLXOYj6osbcfkCCbhhegSBDg==", "dependencies": { - "miniget": "^4.2.1" + "miniget": "^4.2.2" }, "engines": { "node": ">=8" @@ -435,18 +442,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "node_modules/@k3rn31p4nic/google-translate-api": { - "name": "@iamtraction/google-translate", - "version": "1.1.3", - "resolved": "git+ssh://git@github.com/k3rn31p4nic/google-translate-api.git#363662416a4f33238c8dcb4e89bba5c4baae9df9", - "license": "MIT", - "dependencies": { - "got": "^11.8.2" - }, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", @@ -546,17 +541,6 @@ "node": ">=8" } }, - "node_modules/@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "dependencies": { - "defer-to-connect": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -609,9 +593,9 @@ "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, "node_modules/@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "dependencies": { "@types/node": "*", "form-data": "^3.0.0" @@ -970,14 +954,6 @@ "node": ">= 0.8" } }, - "node_modules/cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", - "engines": { - "node": ">=10.6.0" - } - }, "node_modules/cacheable-request": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", @@ -1329,6 +1305,11 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/customizable-discordjs-pagination": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/customizable-discordjs-pagination/-/customizable-discordjs-pagination-1.3.1.tgz", + "integrity": "sha512-6kjYOWKi+4zNs3Os3MvOi2ZqGFmMZgbhXOJRQszbEkAJTvpVtbhzPoDsU222QMk5HfmV2y10NOO9bjpDrRTS/w==" + }, "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -1337,12 +1318,6 @@ "node": ">=8" } }, - "node_modules/dblapi.js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dblapi.js/-/dblapi.js-2.4.1.tgz", - "integrity": "sha512-g+u1inF/qOLit5qPK4hBGk5pKL1vy09uBLV+nukkRMvw2S9D1PyiyO70n4fboUXOgbExPp6Sho/Y782OqQOUiQ==", - "deprecated": "Module is no longer maintained" - }, "node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -1400,12 +1375,12 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "node_modules/deepmerge-ts": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.1.tgz", + "integrity": "sha512-xzJLiUo4z1dD2nggSfaMvHo5qWLoy/JVa9rKuktC6FrQQEBI8Qnj7KwuCYZhqBoGOOpGqs6+3MR2ZhSMcTr4BA==", "engines": { - "node": ">=0.10.0" + "node": ">=12.4.0" } }, "node_modules/defer-to-connect": { @@ -1462,40 +1437,23 @@ } }, "node_modules/discord-api-types": { - "version": "0.36.3", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", - "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" - }, - "node_modules/discord-backup": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/discord-backup/-/discord-backup-3.2.1.tgz", - "integrity": "sha512-eCarIkZzl7eJ/wlr5JqnRF25oyFf61UQsgtqhqHOE+8S26o/QboOcNGhCxYV07vPZQyhJ3i/6WwKJggMGxNZcQ==", - "dependencies": { - "discord.js": "^13.6.0" - } + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.0.tgz", + "integrity": "sha512-6LlL0xceiZs/kQ5PeKe5inkcjR73vagt3oACsP/C5IWKjXfzLGKrXn6yRYgiHIeJyFZ1xVPRJYE4W/u8UTT4ig==" }, "node_modules/discord-giveaways": { - "version": "5.0.1", - "resolved": "git+ssh://git@github.com/Androz2091/discord-giveaways.git#b6b0f3771ede7934c0ce2da373338853034262c6", - "license": "MIT", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/discord-giveaways/-/discord-giveaways-6.0.0.tgz", + "integrity": "sha512-Ii6LAy0XooFjlffNabpyzN1CxWz3W2nmQ+6cLUxRUTXBMdq2gsk9d15lXBTvyG01kxF6Ko6f7EZEb9D83Rrrvw==", "dependencies": { - "deepmerge": "^4.2.2", - "discord.js": "^13.5.0", + "deepmerge-ts": "^4.2.1", "serialize-javascript": "^6.0.0" }, "engines": { - "node": ">=16.6.0" - } - }, - "node_modules/discord-paginationembed": { - "version": "3.0.0-dev.0", - "resolved": "git+ssh://git@github.com/gazmull/discord-paginationembed.git#cd7de9493d11d9db2a8ae15647937e11bc0f7b60", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" + "node": ">=16.9.0" }, "peerDependencies": { - "discord.js": "^13.0.0-dev.4206e35.1626393827" + "discord.js": ">=14.0.0" } }, "node_modules/discord-together": { @@ -1507,36 +1465,14 @@ "node-fetch": "^2.6.1" } }, - "node_modules/discord.js": { - "version": "13.8.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", - "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", + "node_modules/discord-together/node_modules/@discordjs/builders": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", + "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", "deprecated": "no longer supported", "dependencies": { - "@discordjs/builders": "^0.14.0", - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.1", - "@types/node-fetch": "^2.6.1", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.1", - "ws": "^8.7.0" - }, - "engines": { - "node": ">=16.6.0", - "npm": ">=7.0.0" - } - }, - "node_modules/discord.js/node_modules/@discordjs/builders": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", - "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", - "deprecated": "no longer supported", - "dependencies": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" @@ -1545,33 +1481,101 @@ "node": ">=16.9.0" } }, - "node_modules/discord.js/node_modules/discord-api-types": { + "node_modules/discord-together/node_modules/@discordjs/collection": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", + "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==", + "deprecated": "no longer supported", + "engines": { + "node": ">=16.9.0" + } + }, + "node_modules/discord-together/node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "node_modules/discord-together/node_modules/discord.js": { + "version": "13.9.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.9.2.tgz", + "integrity": "sha512-wShFlyAyxgQcWzINeufUoT1U0fmju+pPCRzPfJB7CaA0V1tQHc4e0PpO4NQif8sLfZvrQmEILBaIJ0G5I32OxQ==", + "dependencies": { + "@discordjs/builders": "^0.16.0", + "@discordjs/collection": "^0.7.0", + "@sapphire/async-queue": "^1.3.2", + "@types/node-fetch": "^2.6.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "ws": "^8.8.1" + }, + "engines": { + "node": ">=16.6.0", + "npm": ">=7.0.0" + } + }, + "node_modules/discord-together/node_modules/discord.js/node_modules/discord-api-types": { "version": "0.33.5", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" }, - "node_modules/distube": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/distube/-/distube-3.3.4.tgz", - "integrity": "sha512-izJFDL1dfTzPgTXZbGavyDXDnodkuykVGFSWuFPL9EY83et/qhjQFosLwYoWTJWQN8tG6KPUc5wPi4EZxxy/4g==", + "node_modules/discord.js": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.1.tgz", + "integrity": "sha512-6Oa2f+Y0+s6B5HTTqcAP7Z6tUmguNTKpzbuTmE1JIeT/aUTr9dVe397D/bvcBSRpJERQzMyEWyEiVQnMRHcx4A==", "dependencies": { - "@distube/youtube-dl": "^2.2.4", - "@distube/ytdl-core": "^4.11.1", - "@distube/ytpl": "^1.1.1", - "@distube/ytsr": "^1.1.5", - "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", - "tiny-typed-emitter": "^2.1.0" + "@discordjs/builders": "^1.1.0", + "@discordjs/collection": "^1.0.1", + "@discordjs/rest": "^1.0.1", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.36.3", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.0", + "undici": "^5.8.0", + "ws": "^8.8.1" }, "engines": { - "node": ">=12.0.0" + "node": ">=16.9.0" + } + }, + "node_modules/discord.js/node_modules/discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "node_modules/distube": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.3.tgz", + "integrity": "sha512-EMR/4d1EgNtNIdTPhwBOtVKqkPX1YJBB4JwPymWIX/i6ip0451X+vZGwJamP2LFh46Usssay0ty+Dm1U0/jQ1g==", + "funding": [ + { + "type": "individual", + "url": "https://paypal.me/Skickkk" + }, + { + "type": "patreon", + "url": "https://patreon.com/DisTube" + } + ], + "dependencies": { + "@distube/ytdl-core": "^4.11.3", + "@distube/ytpl": "^1.1.1", + "@distube/ytsr": "^1.1.8", + "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "undici": "^5.8.0" }, - "funding": { - "url": "https://patreon.com/DisTube" + "engines": { + "node": ">=16.9.0" }, "peerDependencies": { "@discordjs/opus": "*", - "@discordjs/voice": ">=0.5.6", - "discord.js": "^12.5.0||13.x" + "@discordjs/voice": "*", + "discord.js": "14" }, "peerDependenciesMeta": { "@discordjs/opus": { @@ -2117,14 +2121,6 @@ "node": ">=10" } }, - "node_modules/figlet": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", - "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -2138,12 +2134,12 @@ } }, "node_modules/file-type": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.3.tgz", - "integrity": "sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.4.tgz", + "integrity": "sha512-3w/rJUUPBj6CYhVER3D5JCKwYJJiC36uj5dP+LnyubHI6H6FJo1TeWVCEA09YLVoZqV3/mLP26j9+Pz1GjAyjQ==", "dependencies": { "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0-alpha.7", + "strtok3": "^7.0.0-alpha.9", "token-types": "^5.0.0-alpha.2" }, "engines": { @@ -2543,30 +2539,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "dependencies": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - }, - "engines": { - "node": ">=10.19.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/got?sponsor=1" - } - }, "node_modules/graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -2641,18 +2613,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, - "node_modules/http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "dependencies": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - }, - "engines": { - "node": ">=10.19.0" - } - }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -2834,14 +2794,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-unix": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-unix/-/is-unix-1.0.1.tgz", - "integrity": "sha512-8Iu9y/xCBmg1uwWV3J/jNl3udPHPAYyqGv4OKE/70O10U2qmt1v3/SRhSAW5+GiRpU2yZEnl+z1Oxm4A8arVrA==", - "engines": { - "node": ">= 12" - } - }, "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -2947,11 +2899,6 @@ "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" }, - "node_modules/js-string-cleaner": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/js-string-cleaner/-/js-string-cleaner-1.2.0.tgz", - "integrity": "sha512-nasV4rj3sgD43GvkwhyBM63eQH6I+4AYfsORISI2G+StTeRhK5sZq95PIvz9oURIFNs6KZmDRN8zBPlVHwuLrw==" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3028,19 +2975,6 @@ "node": ">= 0.8.0" } }, - "node_modules/libsodium": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", - "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" - }, - "node_modules/libsodium-wrappers": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", - "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", - "dependencies": { - "libsodium": "^0.7.0" - } - }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -3051,6 +2985,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, "node_modules/lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -3480,9 +3419,9 @@ } }, "node_modules/node-addon-api": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.2.0.tgz", - "integrity": "sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, "node_modules/node-fetch": { "version": "2.6.7", @@ -3635,55 +3574,6 @@ "node": ">= 0.8.0" } }, - "node_modules/p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "dependencies": { - "p-timeout": "^3.1.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "engines": { - "node": ">=4" - } - }, - "node_modules/p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==", - "engines": { - "node": ">=8" - } - }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dependencies": { - "p-finally": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -4351,11 +4241,6 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, - "node_modules/string-sanitizer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string-sanitizer/-/string-sanitizer-1.1.1.tgz", - "integrity": "sha512-ZaqlidMholFiBaKDPPVf9cJjNo6iRhP6g/ei5qTgvzKEMa8TK/nu4hM90YZ2LvfjvAomF2LIexmOlX1MvYN+ug==" - }, "node_modules/string-to-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz", @@ -4410,9 +4295,9 @@ } }, "node_modules/strtok3": { - "version": "7.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.8.tgz", - "integrity": "sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==", + "version": "7.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.9.tgz", + "integrity": "sha512-G8WxjBFjTZ77toVElv1i7k3jCXNkBB14FVaZ/6LIOka/WGo4La5XHLrU7neFVLdKbXESZf4BejVKZu5maOmocA==", "dependencies": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.0.0-alpha.5" @@ -4782,9 +4667,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "node_modules/ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "engines": { "node": ">=10.0.0" }, @@ -4946,85 +4831,104 @@ } }, "@discordjs/builders": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.0.0.tgz", - "integrity": "sha512-8y91ZfpOHubiGJu5tVyGI9tQCEyHZDTeqUWVcJd0dq7B96xIf84S0L4fwmD1k9zTe1eqEFSk0gc7BpY+FKn7Ww==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.1.0.tgz", + "integrity": "sha512-EO8TSltiIc9Z1wE854wAFvv5AccqEtvjFmao9PPoxQhRaJ0hEb7FwWRTCA1jGg4ZWI3hcp4m+RET5ufZQz3rOg==", "requires": { "@sapphire/shapeshift": "^3.5.1", - "discord-api-types": "^0.36.2", + "discord-api-types": "^0.36.3", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" + }, + "dependencies": { + "discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + } } }, "@discordjs/collection": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", - "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.1.tgz", + "integrity": "sha512-5V/wswzR3r2RVYXLxxg4TvrAnBhVCNgHTXhC+OUtLoriJ072rPMHo+Iw1SS1vrCckp8Es40XM411+WkNRPaXFw==" }, "@discordjs/node-pre-gyp": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.2.tgz", - "integrity": "sha512-V239Czn+DXFGLhhuccwEDBoTdgMGrRu30dOlzm1GzrSIjwFj01ZJerNX7x+CEX1NG1Q/1gGfOOkeZFNHjycrRA==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@discordjs/node-pre-gyp/-/node-pre-gyp-0.4.4.tgz", + "integrity": "sha512-x569MMtdk6jdGo2S58iiZoyv4p/N2Ju8Nh6vvzZb1wyouV7IE3VuU0hg2kqUmTfD0z6r4uD6acvMTuc+iA3f8g==", "requires": { - "detect-libc": "^1.0.3", + "detect-libc": "^2.0.0", "https-proxy-agent": "^5.0.0", "make-dir": "^3.1.0", - "node-fetch": "^2.6.5", + "node-fetch": "^2.6.7", "nopt": "^5.0.0", "npmlog": "^5.0.1", "rimraf": "^3.0.2", "semver": "^7.3.5", "tar": "^6.1.11" + }, + "dependencies": { + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + } } }, "@discordjs/opus": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.7.0.tgz", - "integrity": "sha512-3Xxa3dh7taSDwBAR5fLALZ/KTxvbMmHCMxYLYve6NlPO7Ms1CLmKqp/R4ZoVzkRGQVUVWEhaB1s0v9jfa2tfDg==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@discordjs/opus/-/opus-0.8.0.tgz", + "integrity": "sha512-uHE7OmHEmP8YM0yvsH3iSdacdeghO0qTkF0CIkV07Tg0qdyOLUVkoZHj5Zcpge9rC4qb/JvTS2xRgttSZLM43Q==", "requires": { - "@discordjs/node-pre-gyp": "^0.4.2", - "node-addon-api": "^4.2.0" + "@discordjs/node-pre-gyp": "^0.4.4", + "node-addon-api": "^5.0.0" } }, "@discordjs/rest": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.0.tgz", - "integrity": "sha512-uDAvnE0P2a8axMdD4C51EGjvCRQ2HZk2Yxf6vHWZgIqG87D8DGKMPwmquIxrrB07MjV+rwci2ObU+mGhGP+bJg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-1.0.1.tgz", + "integrity": "sha512-w08CTKVzzYYvKxEjXKOs9AdS7KQ1J502TrPfF8eCZ2lF6AfKuMP/32YgDakiwIyYTDjEQS/v0nKLSFcncHRMtg==", "requires": { - "@discordjs/collection": "^1.0.0", + "@discordjs/collection": "^1.0.1", "@sapphire/async-queue": "^1.3.2", "@sapphire/snowflake": "^3.2.2", - "discord-api-types": "^0.36.2", - "file-type": "^17.1.2", + "discord-api-types": "^0.36.3", + "file-type": "^17.1.4", "tslib": "^2.4.0", - "undici": "^5.7.0" + "undici": "^5.8.0" }, "dependencies": { - "@discordjs/collection": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.0.0.tgz", - "integrity": "sha512-nAxDQYE5dNAzEGQ7HU20sujDsG5vLowUKCEqZkKUIlrXERZFTt/60zKUj/g4+AVCGeq+pXC5hivMaNtiC+PY5Q==" + "discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" } } }, "@discordjs/voice": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.10.0.tgz", - "integrity": "sha512-tChDKRRbKwWHcyq1dSEzrnuCMJyLtKXcFhgQpqcS2YjZ1TLlXboc/mhrR8jA1Yb1rB81u8dgj/lPkkHsk0ItEg==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@discordjs/voice/-/voice-0.11.0.tgz", + "integrity": "sha512-6+9cj1dxzBJm7WJ9qyG2XZZQ8rcLl6x2caW0C0OxuTtMLAaEDntpb6lqMTFiBg/rDc4Rd59g1w0gJmib33CuHw==", "requires": { "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "prism-media": "^1.3.2", - "tiny-typed-emitter": "^2.1.0", + "discord-api-types": "^0.36.2", + "prism-media": "^1.3.4", "tslib": "^2.4.0", - "ws": "^8.7.0" + "ws": "^8.8.1" }, "dependencies": { "discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "prism-media": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", + "requires": {} } } }, @@ -5047,21 +4951,6 @@ "spotify-web-api-node": "^5.0.2" } }, - "@distube/youtube-dl": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@distube/youtube-dl/-/youtube-dl-2.2.4.tgz", - "integrity": "sha512-rGmnVqNF6LjGb5zpSLicLgeK9MbIJ/wOJ6Zl5g9V44Cnfkxfk76VNtzd9wNp3JPdWPa9aD9HUsMA4H72Z9ZoiQ==", - "requires": { - "dargs": "~7.0.0", - "execa": "~5.1.1", - "get-stream": "~6.0.1", - "got": "~11.8.2", - "is-unix": "~1.0.0", - "mkdirp": "~1.0.4", - "p-event": "~4.2.0", - "p-reflect": "~2.1.0" - } - }, "@distube/yt-dlp": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@distube/yt-dlp/-/yt-dlp-1.1.3.tgz", @@ -5092,11 +4981,11 @@ } }, "@distube/ytsr": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.5.tgz", - "integrity": "sha512-nSYsB+UYw0FXSivJ49MGkES41Gfg5rgavil9nOHra0yCsGiY4qsDzpoFVjCmbpKQ6GDUq4Z/8LOwZakgpH3N1A==", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.8.tgz", + "integrity": "sha512-/6pVd9Hiu6EbjPbbC4PKckse957LMiCYYwULWH7Ctovbc/mdPz9pT7hsFIBqx1vLXOYj6osbcfkCCbhhegSBDg==", "requires": { - "miniget": "^4.2.1" + "miniget": "^4.2.2" } }, "@eslint/eslintrc": { @@ -5133,13 +5022,6 @@ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "dev": true }, - "@k3rn31p4nic/google-translate-api": { - "version": "git+ssh://git@github.com/k3rn31p4nic/google-translate-api.git#363662416a4f33238c8dcb4e89bba5c4baae9df9", - "from": "@k3rn31p4nic/google-translate-api@github:k3rn31p4nic/google-translate-api", - "requires": { - "got": "^11.8.2" - } - }, "@mapbox/node-pre-gyp": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.8.tgz", @@ -5205,14 +5087,6 @@ } } }, - "@szmarczak/http-timer": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", - "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", - "requires": { - "defer-to-connect": "^2.0.0" - } - }, "@tokenizer/token": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", @@ -5265,9 +5139,9 @@ "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, "@types/node-fetch": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.1.tgz", - "integrity": "sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", + "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", "requires": { "@types/node": "*", "form-data": "^3.0.0" @@ -5572,11 +5446,6 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" }, - "cacheable-lookup": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", - "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" - }, "cacheable-request": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", @@ -5840,16 +5709,16 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, + "customizable-discordjs-pagination": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/customizable-discordjs-pagination/-/customizable-discordjs-pagination-1.3.1.tgz", + "integrity": "sha512-6kjYOWKi+4zNs3Os3MvOi2ZqGFmMZgbhXOJRQszbEkAJTvpVtbhzPoDsU222QMk5HfmV2y10NOO9bjpDrRTS/w==" + }, "dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==" }, - "dblapi.js": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dblapi.js/-/dblapi.js-2.4.1.tgz", - "integrity": "sha512-g+u1inF/qOLit5qPK4hBGk5pKL1vy09uBLV+nukkRMvw2S9D1PyiyO70n4fboUXOgbExPp6Sho/Y782OqQOUiQ==" - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -5891,10 +5760,10 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "deepmerge": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + "deepmerge-ts": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/deepmerge-ts/-/deepmerge-ts-4.2.1.tgz", + "integrity": "sha512-xzJLiUo4z1dD2nggSfaMvHo5qWLoy/JVa9rKuktC6FrQQEBI8Qnj7KwuCYZhqBoGOOpGqs6+3MR2ZhSMcTr4BA==" }, "defer-to-connect": { "version": "2.0.1", @@ -5932,32 +5801,19 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, "discord-api-types": { - "version": "0.36.3", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", - "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" - }, - "discord-backup": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/discord-backup/-/discord-backup-3.2.1.tgz", - "integrity": "sha512-eCarIkZzl7eJ/wlr5JqnRF25oyFf61UQsgtqhqHOE+8S26o/QboOcNGhCxYV07vPZQyhJ3i/6WwKJggMGxNZcQ==", - "requires": { - "discord.js": "^13.6.0" - } + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.0.tgz", + "integrity": "sha512-6LlL0xceiZs/kQ5PeKe5inkcjR73vagt3oACsP/C5IWKjXfzLGKrXn6yRYgiHIeJyFZ1xVPRJYE4W/u8UTT4ig==" }, "discord-giveaways": { - "version": "git+ssh://git@github.com/Androz2091/discord-giveaways.git#b6b0f3771ede7934c0ce2da373338853034262c6", - "from": "discord-giveaways@github:Androz2091/discord-giveaways#develop", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/discord-giveaways/-/discord-giveaways-6.0.0.tgz", + "integrity": "sha512-Ii6LAy0XooFjlffNabpyzN1CxWz3W2nmQ+6cLUxRUTXBMdq2gsk9d15lXBTvyG01kxF6Ko6f7EZEb9D83Rrrvw==", "requires": { - "deepmerge": "^4.2.2", - "discord.js": "^13.5.0", + "deepmerge-ts": "^4.2.1", "serialize-javascript": "^6.0.0" } }, - "discord-paginationembed": { - "version": "git+ssh://git@github.com/gazmull/discord-paginationembed.git#cd7de9493d11d9db2a8ae15647937e11bc0f7b60", - "from": "discord-paginationembed@github:gazmull/discord-paginationembed#v3", - "requires": {} - }, "discord-together": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/discord-together/-/discord-together-1.3.3.tgz", @@ -5965,55 +5821,92 @@ "requires": { "discord.js": "^13.1.0", "node-fetch": "^2.6.1" - } - }, - "discord.js": { - "version": "13.8.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.8.1.tgz", - "integrity": "sha512-jOsD+4tEZWWx0RHVyH+FBcqoTrsL+d5Mm5p+ULQOdU0qSaxhLNkWYig+yDHNZoND7nlkXX3qi+BW+gO5erWylg==", - "requires": { - "@discordjs/builders": "^0.14.0", - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.1", - "@types/node-fetch": "^2.6.1", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.1", - "ws": "^8.7.0" }, "dependencies": { "@discordjs/builders": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.14.0.tgz", - "integrity": "sha512-+fqLIqa9wN3R+kvlld8sgG0nt04BAZxdCDP4t2qZ9TJsquLWA+xMtT8Waibb3d4li4AQS+IOfjiHAznv/dhHgQ==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", + "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", "requires": { - "@sapphire/shapeshift": "^3.1.0", - "@sindresorhus/is": "^4.6.0", - "discord-api-types": "^0.33.3", + "@sapphire/shapeshift": "^3.5.1", + "discord-api-types": "^0.36.2", "fast-deep-equal": "^3.1.3", "ts-mixer": "^6.0.1", "tslib": "^2.4.0" } }, + "@discordjs/collection": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", + "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==" + }, "discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" + }, + "discord.js": { + "version": "13.9.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.9.2.tgz", + "integrity": "sha512-wShFlyAyxgQcWzINeufUoT1U0fmju+pPCRzPfJB7CaA0V1tQHc4e0PpO4NQif8sLfZvrQmEILBaIJ0G5I32OxQ==", + "requires": { + "@discordjs/builders": "^0.16.0", + "@discordjs/collection": "^0.7.0", + "@sapphire/async-queue": "^1.3.2", + "@types/node-fetch": "^2.6.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.33.3", + "form-data": "^4.0.0", + "node-fetch": "^2.6.7", + "ws": "^8.8.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.33.5", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", + "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" + } + } + } + } + }, + "discord.js": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.1.tgz", + "integrity": "sha512-6Oa2f+Y0+s6B5HTTqcAP7Z6tUmguNTKpzbuTmE1JIeT/aUTr9dVe397D/bvcBSRpJERQzMyEWyEiVQnMRHcx4A==", + "requires": { + "@discordjs/builders": "^1.1.0", + "@discordjs/collection": "^1.0.1", + "@discordjs/rest": "^1.0.1", + "@sapphire/snowflake": "^3.2.2", + "@types/ws": "^8.5.3", + "discord-api-types": "^0.36.3", + "fast-deep-equal": "^3.1.3", + "lodash.snakecase": "^4.1.1", + "tslib": "^2.4.0", + "undici": "^5.8.0", + "ws": "^8.8.1" + }, + "dependencies": { + "discord-api-types": { + "version": "0.36.3", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", + "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" } } }, "distube": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/distube/-/distube-3.3.4.tgz", - "integrity": "sha512-izJFDL1dfTzPgTXZbGavyDXDnodkuykVGFSWuFPL9EY83et/qhjQFosLwYoWTJWQN8tG6KPUc5wPi4EZxxy/4g==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.3.tgz", + "integrity": "sha512-EMR/4d1EgNtNIdTPhwBOtVKqkPX1YJBB4JwPymWIX/i6ip0451X+vZGwJamP2LFh46Usssay0ty+Dm1U0/jQ1g==", "requires": { - "@distube/youtube-dl": "^2.2.4", - "@distube/ytdl-core": "^4.11.1", + "@distube/ytdl-core": "^4.11.3", "@distube/ytpl": "^1.1.1", - "@distube/ytsr": "^1.1.5", + "@distube/ytsr": "^1.1.8", "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", - "tiny-typed-emitter": "^2.1.0" + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "undici": "^5.8.0" } }, "doctrine": { @@ -6442,11 +6335,6 @@ "progress": "^2.0.3" } }, - "figlet": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/figlet/-/figlet-1.5.2.tgz", - "integrity": "sha512-WOn21V8AhyE1QqVfPIVxe3tupJacq1xGkPTB4iagT6o+P2cAgEOOwIxMftr4+ZCTI6d551ij9j61DFr0nsP2uQ==" - }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -6457,12 +6345,12 @@ } }, "file-type": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.3.tgz", - "integrity": "sha512-MFVSozBIhvnx2dkxlf+010Xqn6+ojlMUT9LXQiPNoOijgRtXNMghWdGK0u2o1RoCqzHoVsw65IL8ZBcQ4MhIrw==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-17.1.4.tgz", + "integrity": "sha512-3w/rJUUPBj6CYhVER3D5JCKwYJJiC36uj5dP+LnyubHI6H6FJo1TeWVCEA09YLVoZqV3/mLP26j9+Pz1GjAyjQ==", "requires": { "readable-web-to-node-stream": "^3.0.2", - "strtok3": "^7.0.0-alpha.7", + "strtok3": "^7.0.0-alpha.9", "token-types": "^5.0.0-alpha.2" } }, @@ -6766,24 +6654,6 @@ "type-fest": "^0.20.2" } }, - "got": { - "version": "11.8.3", - "resolved": "https://registry.npmjs.org/got/-/got-11.8.3.tgz", - "integrity": "sha512-7gtQ5KiPh1RtGS9/Jbv1ofDpBFuq42gyfEib+ejaRBJuj/3tQFeR5+gw57e4ipaU8c/rCjvX6fkQz2lyDlGAOg==", - "requires": { - "@sindresorhus/is": "^4.0.0", - "@szmarczak/http-timer": "^4.0.5", - "@types/cacheable-request": "^6.0.1", - "@types/responselike": "^1.0.0", - "cacheable-lookup": "^5.0.3", - "cacheable-request": "^7.0.2", - "decompress-response": "^6.0.0", - "http2-wrapper": "^1.0.0-beta.5.2", - "lowercase-keys": "^2.0.0", - "p-cancelable": "^2.0.0", - "responselike": "^2.0.0" - } - }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -6847,15 +6717,6 @@ } } }, - "http2-wrapper": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", - "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", - "requires": { - "quick-lru": "^5.1.1", - "resolve-alpn": "^1.0.0" - } - }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -6982,11 +6843,6 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, - "is-unix": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-unix/-/is-unix-1.0.1.tgz", - "integrity": "sha512-8Iu9y/xCBmg1uwWV3J/jNl3udPHPAYyqGv4OKE/70O10U2qmt1v3/SRhSAW5+GiRpU2yZEnl+z1Oxm4A8arVrA==" - }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", @@ -7073,11 +6929,6 @@ "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" }, - "js-string-cleaner": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/js-string-cleaner/-/js-string-cleaner-1.2.0.tgz", - "integrity": "sha512-nasV4rj3sgD43GvkwhyBM63eQH6I+4AYfsORISI2G+StTeRhK5sZq95PIvz9oURIFNs6KZmDRN8zBPlVHwuLrw==" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -7142,19 +6993,6 @@ "type-check": "~0.4.0" } }, - "libsodium": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.9.tgz", - "integrity": "sha512-gfeADtR4D/CM0oRUviKBViMGXZDgnFdMKMzHsvBdqLBHd9ySi6EtYnmuhHVDDYgYpAO8eU8hEY+F8vIUAPh08A==" - }, - "libsodium-wrappers": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.9.tgz", - "integrity": "sha512-9HaAeBGk1nKTRFRHkt7nzxqCvnkWTjn1pdjKgcUnZxj0FyOP4CnhgFhMdrFfgNsukijBGyBLpP2m2uKT1vuWhQ==", - "requires": { - "libsodium": "^0.7.0" - } - }, "lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -7165,6 +7003,11 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==" + }, "lodash.truncate": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", @@ -7480,9 +7323,9 @@ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" }, "node-addon-api": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.2.0.tgz", - "integrity": "sha512-eazsqzwG2lskuzBqCGPi7Ac2UgOoMz8JVOXVhTvvPDYhthvNpefx8jWD8Np7Gv+2Sz0FlPWZk0nJV0z598Wn8Q==" + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.0.0.tgz", + "integrity": "sha512-CvkDw2OEnme7ybCykJpVcKH+uAOLV2qLqiyla128dN9TkEWfrYmxG6C2boDe5KcNQqZF3orkqzGgOMvZ/JNekA==" }, "node-fetch": { "version": "2.6.7", @@ -7585,37 +7428,6 @@ "word-wrap": "^1.2.3" } }, - "p-cancelable": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", - "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" - }, - "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", - "requires": { - "p-timeout": "^3.1.0" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, - "p-reflect": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-reflect/-/p-reflect-2.1.0.tgz", - "integrity": "sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==" - }, - "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "requires": { - "p-finally": "^1.0.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7675,8 +7487,7 @@ "dev": true }, "prism-media": { - "version": "1.3.3", - "resolved": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", + "version": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", "integrity": "sha512-2a/62b86i60OksrnliRwG7IGMHjFHM0KiRYk6YBi43IZpCZCf/ZLjXIbMGtzzeTZhEJy1Fi6Ke6kKtn2ObNjPw==", "requires": {} }, @@ -8104,11 +7915,6 @@ } } }, - "string-sanitizer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string-sanitizer/-/string-sanitizer-1.1.1.tgz", - "integrity": "sha512-ZaqlidMholFiBaKDPPVf9cJjNo6iRhP6g/ei5qTgvzKEMa8TK/nu4hM90YZ2LvfjvAomF2LIexmOlX1MvYN+ug==" - }, "string-to-stream": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string-to-stream/-/string-to-stream-1.1.1.tgz", @@ -8148,9 +7954,9 @@ "dev": true }, "strtok3": { - "version": "7.0.0-alpha.8", - "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.8.tgz", - "integrity": "sha512-u+k19v+rTxBjGYxncRQjGvZYwYvEd0uP3D+uHKe/s4WB1eXS5ZwpZsTlBu5xSS4zEd89mTXECXg6WW3FSeV8cA==", + "version": "7.0.0-alpha.9", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-7.0.0-alpha.9.tgz", + "integrity": "sha512-G8WxjBFjTZ77toVElv1i7k3jCXNkBB14FVaZ/6LIOka/WGo4La5XHLrU7neFVLdKbXESZf4BejVKZu5maOmocA==", "requires": { "@tokenizer/token": "^0.3.0", "peek-readable": "^5.0.0-alpha.5" @@ -8439,9 +8245,9 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.7.0.tgz", - "integrity": "sha512-c2gsP0PRwcLFzUiA8Mkr37/MI7ilIlHQxaEAtd0uNMbVMoy8puJyafRlm0bV9MbGSabUPeLrRRaqIBcFcA2Pqg==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.1.tgz", + "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "requires": {} }, "xmlbuilder": { diff --git a/package.json b/package.json index f7a0a038..bb1f5148 100644 --- a/package.json +++ b/package.json @@ -9,18 +9,16 @@ "lint": "eslint . --ext .js", "testcfg": "node scripts/verify-config.js" }, - "author": "Jonny_Bro", + "author": "Jonny_Bro#4226", "license": "ISC", "dependencies": { - "@discordjs/builders": "^1.0.0", - "@discordjs/opus": "^0.7.0", + "@discordjs/opus": "^0.8.0", "@discordjs/rest": "^1.0.0", - "@discordjs/voice": "^0.10.0", + "@discordjs/voice": "^0.11.0", "@distube/soundcloud": "^1.2.1", "@distube/spotify": "^1.3.2", "@distube/yt-dlp": "^1.1.3", "@distube/ytdl-core": "^4.11.3", - "@k3rn31p4nic/google-translate-api": "github:k3rn31p4nic/google-translate-api", "@sindresorhus/slugify": "^1.1.0", "amethyste-api": "github:Androz2091/amethyste-api", "btoa": "^1.2.1", @@ -29,31 +27,25 @@ "chalk": "^4.1.0", "colors-generator": "^0.3.4", "cron": "^1.7.2", - "dblapi.js": "^2.3.0", - "discord-api-types": "^0.36.3", - "discord-backup": "^3.2.1", - "discord-giveaways": "github:Androz2091/discord-giveaways#develop", - "discord-paginationembed": "github:gazmull/discord-paginationembed#v3", + "customizable-discordjs-pagination": "^1.3.1", + "discord-api-types": "^0.37.0", + "discord-giveaways": "^6.0.0", "discord-together": "^1.3.3", - "discord.js": "^13.8.1", - "distube": "^3.3.4", + "discord.js": "^14.1.1", + "distube": "^4.0.3", "ejs": "^3.1.3", "express": "^4.17.1", "express-session": "^1.17.0", "ffmpeg-static": "^4.4.0", - "figlet": "^1.5.0", "gamedig": "^4.0.2", "i18next": "^20.2.2", "i18next-node-fs-backend": "^2.1.3", - "js-string-cleaner": "^1.0.3", - "libsodium-wrappers": "^0.7.9", "markdown-table": "2.0.0", "mathjs": "^9.0.0", "md5": "^2.2.1", "moment": "^2.26.0", "mongoose": "^5.13.14", - "ms": "^2.1.3", - "string-sanitizer": "^1.1.1" + "ms": "^2.1.3" }, "devDependencies": { "eslint": "^7.5.0" diff --git a/scripts/verify-config.js b/scripts/verify-config.js index ea6c39c6..ea518f50 100644 --- a/scripts/verify-config.js +++ b/scripts/verify-config.js @@ -1,5 +1,5 @@ /* eslint-disable no-async-promise-executor */ -const { Intents } = require("discord.js"), +const { GatewayIntentBits } = require("discord.js"), config = require("../config"), fetch = require("node-fetch"), chalk = require("chalk"), @@ -23,7 +23,7 @@ const checks = [ console.log("\n\nDiscord Bot"); return new Promise((res) => { const Discord = require("discord.js"); - const client = new Discord.Client({ intents: Object.keys(Intents.FLAGS) }); + const client = new Discord.Client({ intents: [ GatewayIntentBits.Guilds ] }); let readyResolve; new Promise((resolve) => readyResolve = resolve); client.login(config.token).then(async () => { From 06a5fbd724f856304399a319e9d5b5fbada4cb0f Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Sun, 31 Jul 2022 18:52:16 +0500 Subject: [PATCH 08/16] =?UTF-8?q?=D0=9F=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=B5=D1=80=D0=B5=D0=BD?= =?UTF-8?q?=D0=BE=D1=81=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=20?= =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81=D0=B8=D0=BA=D0=B8,=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D0=B4=D0=B5=D1=80=D0=BA=D0=B0=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D0=BD=D1=8B=D1=85=20=D0=BA=D0=BE=D0=BC?= =?UTF-8?q?=D0=B0=D0=BD=D0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/Examples/mention.js | 37 ----- TO REWRITE/Examples/repeat.js | 38 ------ TO REWRITE/Moderation/untimeout.js | 60 -------- TO REWRITE/Moderation/warn.js | 156 --------------------- TO REWRITE/Moderation/warns.js | 66 --------- base/BaseCommand.js | 2 +- base/JaBa.js | 7 +- commands/Moderation/warn.js | 190 ++++++++++++++++++++++++++ commands/Moderation/warns.js | 81 +++++++++++ index.js | 2 +- languages/ru-RU/moderation/warn.json | 10 +- languages/ru-RU/moderation/warns.json | 4 +- 12 files changed, 283 insertions(+), 370 deletions(-) delete mode 100644 TO REWRITE/Examples/mention.js delete mode 100644 TO REWRITE/Examples/repeat.js delete mode 100644 TO REWRITE/Moderation/untimeout.js delete mode 100644 TO REWRITE/Moderation/warn.js delete mode 100644 TO REWRITE/Moderation/warns.js create mode 100644 commands/Moderation/warn.js create mode 100644 commands/Moderation/warns.js diff --git a/TO REWRITE/Examples/mention.js b/TO REWRITE/Examples/mention.js deleted file mode 100644 index bfcc2d9f..00000000 --- a/TO REWRITE/Examples/mention.js +++ /dev/null @@ -1,37 +0,0 @@ -const { ApplicationCommandType } = require("discord.js"); -const BaseCommand = require("../../base/BaseCommand"); - -class Mention extends BaseCommand { - /** - * - * @param {import("../../base/JaBa")} client - */ - constructor() { - super({ - command: { - name: "mention", - type: ApplicationCommandType.User - }, - aliases: [], - dirname: __dirname, - guildOnly: true - }); - } - /** - * - * @param {import("../../base/JaBa")} client - */ - async onLoad() { - //... - } - /** - * - * @param {import("../../base/JaBa")} client - * @param {import("discord.js").ContextMenuInteraction} interaction - */ - async execute(client, interaction) { - const target = interaction.member.guild.members.cache.get(interaction.targetId); - return interaction.reply({ content: target.toString(), ephemeral: false, fetchReply: true }).then(m => setTimeout(() => m.delete(), 5000)); - } -} -module.exports = Mention; \ No newline at end of file diff --git a/TO REWRITE/Examples/repeat.js b/TO REWRITE/Examples/repeat.js deleted file mode 100644 index f3e4eed3..00000000 --- a/TO REWRITE/Examples/repeat.js +++ /dev/null @@ -1,38 +0,0 @@ -const { ApplicationCommandType } = require("discord.js"); -const BaseCommand = require("../../base/BaseCommand"); - -class Repeat extends BaseCommand { - /** - * - * @param {import("../../base/JaBa")} client - */ - constructor() { - super({ - command: { - name: "repeat", - type: ApplicationCommandType.Message - }, - aliases: [], - dirname: __dirname, - guildOnly: true - }); - } - /** - * - * @param {import("../../base/JaBa")} client - */ - async onLoad() { - //... - } - /** - * - * @param {import("../../base/JaBa")} client - * @param {import("discord.js").ContextMenuInteraction} interaction - */ - async execute(client, interaction) { - const targetChannel = interaction.member.guild.channels.cache.get(interaction.channelId); - const targetMessage = await targetChannel.messages.fetch(interaction.targetId); - return interaction.reply({ content: targetMessage.content, ephemeral: false, fetchReply: true }).then(m => setTimeout(() => m.delete(), 5000)); - } -} -module.exports = Repeat; \ No newline at end of file diff --git a/TO REWRITE/Moderation/untimeout.js b/TO REWRITE/Moderation/untimeout.js deleted file mode 100644 index 3c0747b9..00000000 --- a/TO REWRITE/Moderation/untimeout.js +++ /dev/null @@ -1,60 +0,0 @@ -const Command = require("../../base/Command"); - -class Untimeout extends Command { - constructor(client) { - super(client, { - name: "untimeout", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["untimeout"], - memberPermissions: ["BAN_MEMBERS"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - let user = null; - - if (!args[0]) return message.error("moderation/unban:MISSING_ID"); - - // Check if the arg is an ID or a username - const isId = !isNaN(args[0]); - - if (isId) { - // Try to find a user with that ID - await this.client.users.fetch(args[0]).then((u) => { - // if a user was found - user = u; - }).catch(() => {}); - } else if (!isId) { - const arr = args[0].split("#"); - if (arr.length < 2) { - return message.error("misc:NO_USER_FOUND_ID", { - id: args[0] - }); - } - user = this.client.users.filter((u) => u.username === arr[0]).find((u) => u.discriminator === arr[1]); - } - - if (!user) return message.error("misc:NO_USER_FOUND_ID", { id: args[0] }); - - // check if the user is banned - const banned = await message.guild.bans.fetch(); - if (!banned.some((e) => e.user.id === user.id)) return message.success("moderation/unban:NOT_BANNED", { username: user.tag }); - - // Unban user - message.guild.members.unban(user).catch(() => {}); - - // Send a success message in the current channel - message.success("moderation/unban:UNBANNED", { - username: user.tag, - server: message.guild.name - }); - } -} - -module.exports = Untimeout; \ No newline at end of file diff --git a/TO REWRITE/Moderation/warn.js b/TO REWRITE/Moderation/warn.js deleted file mode 100644 index a586d7bf..00000000 --- a/TO REWRITE/Moderation/warn.js +++ /dev/null @@ -1,156 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Warn extends Command { - constructor(client) { - super(client, { - name: "warn", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["w"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("moderation/warn:MISSING_MEMBER"); - if (member.user.bot) return message.error("misc:BOT_USER"); - - const memberData = await this.client.findOrCreateMember({ - id: member.id, - guildID: message.guild.id - }); - - if (member.id === message.author.id) return message.error("moderation/warn:YOURSELF"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = message.member.roles.highest.position; - if (message.member.ownerId !== message.author.id && !(moderationPosition > memberPosition)) return message.error("moderation/ban:SUPERIOR"); - - const reason = args.slice(1).join(" "); - if (!reason) return message.error("moderation/warn:MISSING_REASON"); - - // Gets current member sanctions - const sanctions = memberData.sanctions.filter((s) => s.type === "warn").length; - const banCount = data.guild.plugins.warnsSanctions.ban; - const kickCount = data.guild.plugins.warnsSanctions.kick; - - data.guild.casesCount++; - data.guild.save(); - - const caseInfo = { - channel: message.channel.id, - moderator: message.author.id, - date: Date.now(), - type: "warn", - case: data.guild.casesCount, - reason - }; - - const embed = new Discord.EmbedBuilder() - .addFields([ - { - name: message.translate("common:USER"), - value: `\`${member.user.tag}\` (${member.user.toString()})` - }, - { - name: message.translate("common:MODERATOR"), - value: `\`${message.author.tag}\` (${message.author.toString()})` - }, - { - name: message.translate("common:REASON"), - value: reason, - inline: true - } - ]); - - if (banCount) { - if (sanctions >= banCount) { - member.send({ - content: message.translate("moderation/ban:BANNED_DM", { - username: member.user, - moderator: message.author.tag, - server: message.guild.name, - reason - }) - }); - caseInfo.type = "ban"; - embed.setAuthor({ - name: message.translate("moderation/ban:CASE", { - count: data.guild.casesCount - }) - }) - .setColor("#e02316"); - message.guild.members.ban(member).catch(() => {}); - message.success("moderation/setwarns:AUTO_BAN", { - username: member.user.tag, - count: banCount - }); - } - } - - if (kickCount) { - if (sanctions >= kickCount) { - member.send({ - content: message.translate("moderation/kick:KICKED_DM", { - username: member.user, - moderator: message.author.tag, - server: message.guild.name, - reason - }) - }); - caseInfo.type = "kick"; - embed.setAuthor({ - name: message.translate("moderation/kick:CASE", { - count: data.guild.casesCount - }) - }) - .setColor("#e88709"); - member.kick().catch(() => {}); - message.success("moderation/setwarns:AUTO_KICK", { - username: member.user.tag, - count: kickCount - }); - } - } - - member.send({ - content: message.translate("moderation/warn:WARNED_DM", { - username: member.user.tag, - server: message.guild.name, - moderator: message.author.tag, - reason - }) - }); - caseInfo.type = "warn"; - embed.setAuthor({ - name: message.translate("moderation/warn:CASE", { - caseNumber: data.guild.casesCount - }) - }) - .setColor("#8c14e2"); - message.success("moderation/warn:WARNED", { - username: member.user.tag, - reason - }); - - memberData.sanctions.push(caseInfo); - memberData.save(); - - if (data.guild.plugins.modlogs) { - const channel = message.guild.channels.cache.get(data.guild.plugins.modlogs); - if (!channel) return; - channel.send({ - embeds: [embed] - }); - } - } -} - -module.exports = Warn; \ No newline at end of file diff --git a/TO REWRITE/Moderation/warns.js b/TO REWRITE/Moderation/warns.js deleted file mode 100644 index 60d5d19d..00000000 --- a/TO REWRITE/Moderation/warns.js +++ /dev/null @@ -1,66 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Warns extends Command { - constructor(client) { - super(client, { - name: "warns", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ws"], - memberPermissions: ["MANAGE_MESSAGES"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const user = await this.client.resolveUser(args[0]); - if (!user) return message.error("moderation/warns:MISSING_MEMBER"); - - const memberData = await this.client.findOrCreateMember({ - id: user.id, - guildID: message.guild.id - }); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: user.tag, - iconURL: user.displayAvatarURL({ - size: 512, - format: "png" - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - if (memberData.sanctions.length < 1) { - embed.setDescription(message.translate("moderation/warns:NO_SANCTION", { - username: user.tag - })); - return message.reply({ - embeds: [embed] - }); - } else { - memberData.sanctions.forEach((s) => { - embed.addFields([ - { - name: s.type + " | #" + s.case, - value: `${message.translate("common:MODERATOR")}: <@${s.moderator}>\n${message.translate("common:REASON")}: ${s.reason}`, - inline: true - } - ]); - }); - } - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Warns; \ No newline at end of file diff --git a/base/BaseCommand.js b/base/BaseCommand.js index 1bfc0513..213a6fb6 100644 --- a/base/BaseCommand.js +++ b/base/BaseCommand.js @@ -4,7 +4,7 @@ const path = require("path"); class BaseCommand { constructor(options, client) { /** - * @type {import("discord.js").SlashCommandBuilder | import("discord.js").ApplicationCommandData} + * @type {import("discord.js").SlashCommandBuilder | import("discord.js").ContextMenuCommandBuilder | import("discord.js").ApplicationCommandData} */ this.command = options.command; /** diff --git a/base/JaBa.js b/base/JaBa.js index 7212b7f1..570ca22e 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -1,9 +1,8 @@ -const { EmbedBuilder, Client, Collection } = require("discord.js"), +const { EmbedBuilder, Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder } = require("discord.js"), { GiveawaysManager } = require("discord-giveaways"), { SoundCloudPlugin } = require("@distube/soundcloud"), { SpotifyPlugin } = require("@distube/spotify"), { YtDlpPlugin } = require("@distube/yt-dlp"), - { SlashCommandBuilder } = require("discord.js"), { REST } = require("@discordjs/rest"), { Routes } = require("discord-api-types/v10"); @@ -142,14 +141,14 @@ class JaBa extends Client { const aliases = []; if (command.aliases && Array.isArray(command.aliases) && command.aliases.length > 0) { command.aliases.forEach((alias) => { - const command_alias = command.command instanceof SlashCommandBuilder ? { ...command.command.toJSON() } : { ...command.command }; + const command_alias = (command.command instanceof SlashCommandBuilder || command.command instanceof ContextMenuCommandBuilder) ? { ...command.command.toJSON() } : { ...command.command }; command_alias.name = alias; aliases.push(command_alias); this.commands.set(alias, command); }); } - commands.push(command.command instanceof SlashCommandBuilder ? command.command.toJSON() : command.command, ...aliases); + commands.push((command.command instanceof SlashCommandBuilder || command.command instanceof ContextMenuCommandBuilder) ? command.command.toJSON() : command.command, ...aliases); if (command.onLoad || typeof command.onLoad === "function") await command.onLoad(this); this.logger.log(`Successfully loaded "${file}" command file. (Command: ${command.command.name})`); diff --git a/commands/Moderation/warn.js b/commands/Moderation/warn.js new file mode 100644 index 00000000..475deb5a --- /dev/null +++ b/commands/Moderation/warn.js @@ -0,0 +1,190 @@ +const { ContextMenuCommandBuilder, ApplicationCommandType, PermissionFlagsBits, TextInputStyle, ModalBuilder, EmbedBuilder, ActionRowBuilder, TextInputBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Warn extends BaseCommand { + /** + * + * @param {import("../../base/JaBa")} client + */ + constructor() { + super({ + command: new ContextMenuCommandBuilder() + .setName("warn") + .setType(ApplicationCommandType.User) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers && PermissionFlagsBits.ManageMessages), + aliases: [], + dirname: __dirname, + guildOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").UserContextMenuCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction, data) { + const member = interaction.targetMember; + if (member.user.bot) return; + + const memberData = await client.findOrCreateMember({ + id: member.id, + guildID: interaction.guildId + }); + + if (member.id === interaction.user.id) return interaction.error("moderation/warn:YOURSELF"); + + const memberPosition = member.roles.highest.position; + const moderationPosition = interaction.member.roles.highest.position; + if (interaction.guild.ownerId !== interaction.user.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/ban:SUPERIOR"); + + const modal = new ModalBuilder() + .setCustomId("warn_modal") + .setTitle(interaction.translate("moderation/warn:MODAL_TITLE")); + + const reasonInput = new TextInputBuilder() + .setCustomId("reason") + .setLabel(interaction.translate("moderation/warn:REASON")) + .setStyle(TextInputStyle.Short); + + const firstActionRow = new ActionRowBuilder().addComponents(reasonInput); + + modal.addComponents(firstActionRow); + + await interaction.showModal(modal); + + const submitted = await interaction.awaitModalSubmit({ + time: 120000, + filter: i => i.user.id === interaction.user.id, + }); + + if (submitted) { + const reason = submitted.fields.getTextInputValue("reason"); + + const sanctions = memberData.sanctions.filter((s) => s.type === "warn").length; + const banCount = data.guildData.plugins.warnsSanctions.ban; + const kickCount = data.guildData.plugins.warnsSanctions.kick; + + data.guildData.casesCount++; + data.guildData.save(); + + const caseInfo = { + moderator: interaction.user.id, + date: Date.now(), + type: "warn", + case: data.guildData.casesCount, + reason + }; + + const embed = new EmbedBuilder() + .addFields([ + { + name: interaction.translate("common:USER"), + value: `\`${member.user.tag}\` (${member.user.toString()})` + }, + { + name: interaction.translate("common:MODERATOR"), + value: `\`${interaction.user.tag}\` (${interaction.user.toString()})` + }, + { + name: interaction.translate("common:REASON"), + value: reason, + inline: true + } + ]); + + if (banCount) { + if (sanctions >= banCount) { + member.send({ + content: interaction.translate("moderation/ban:BANNED_DM", { + username: member.user, + moderator: interaction.user.tag, + server: interaction.guild.name, + reason + }) + }); + caseInfo.type = "ban"; + embed.setAuthor({ + name: interaction.translate("moderation/ban:CASE", { + count: data.guildData.casesCount + }) + }) + .setColor("#e02316"); + interaction.guild.members.ban(member); + interaction.success("moderation/setwarns:AUTO_BAN", { + username: member.user.tag, + count: `${banCount} ${client.getNoun(banCount, interaction.translate("misc:NOUNS:WARNS:1"), interaction.translate("misc:NOUNS:WARNS:2"), interaction.translate("misc:NOUNS:WARNS:5"))}` + }); + } + } + + if (kickCount) { + if (sanctions >= kickCount) { + member.send({ + content: interaction.translate("moderation/kick:KICKED_DM", { + username: member.user, + moderator: interaction.user.tag, + server: interaction.guild.name, + reason + }) + }); + caseInfo.type = "kick"; + embed.setAuthor({ + name: interaction.translate("moderation/kick:CASE", { + count: data.guildData.casesCount + }) + }) + .setColor("#e88709"); + member.kick().catch(() => {}); + interaction.success("moderation/setwarns:AUTO_KICK", { + username: member.user.tag, + count: `${kickCount} ${client.getNoun(kickCount, interaction.translate("misc:NOUNS:WARNS:1"), interaction.translate("misc:NOUNS:WARNS:2"), interaction.translate("misc:NOUNS:WARNS:5"))}` + }); + } + } + + member.send({ + content: interaction.translate("moderation/warn:WARNED_DM", { + username: member.user.tag, + server: interaction.guild.name, + moderator: interaction.user.tag, + reason + }) + }); + + caseInfo.type = "warn"; + embed.setAuthor({ + name: interaction.translate("moderation/warn:CASE", { + caseNumber: data.guildData.casesCount + }) + }).setColor("#8c14e2"); + + submitted.reply({ + content: interaction.translate("moderation/warn:WARNED", { + username: member.user.tag, + reason + }) + }); + + memberData.sanctions.push(caseInfo); + memberData.save(); + + if (data.guildData.plugins.modlogs) { + const channel = interaction.guild.channels.cache.get(data.guildData.plugins.modlogs); + if (!channel) return; + channel.send({ + embeds: [embed] + }); + } + } + } +} + +module.exports = Warn; \ No newline at end of file diff --git a/commands/Moderation/warns.js b/commands/Moderation/warns.js new file mode 100644 index 00000000..0ad05d77 --- /dev/null +++ b/commands/Moderation/warns.js @@ -0,0 +1,81 @@ +const { ApplicationCommandType, PermissionFlagsBits, EmbedBuilder, ContextMenuCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Warns extends BaseCommand { + /** + * + * @param {import("../../base/JaBa")} client + */ + constructor() { + super({ + command: new ContextMenuCommandBuilder() + .setName("warns") + .setType(ApplicationCommandType.User) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers && PermissionFlagsBits.ManageMessages), + aliases: [], + dirname: __dirname, + guildOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").UserContextMenuCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const member = interaction.targetMember; + if (member.user.bot) return; + + const memberData = await client.findOrCreateMember({ + id: member.id, + guildID: interaction.guildId + }); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("moderation/warns:SANCTIONS_OF", { + member: member.nickname || member.user.username + }), + iconURL: member.displayAvatarURL({ + size: 512, + format: "png" + }) + }) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + if (memberData.sanctions.length < 1) { + embed.setDescription(interaction.translate("moderation/warns:NO_SANCTION", { + member: member.nickname || member.user.username + })); + return interaction.reply({ + embeds: [embed] + }); + } else { + memberData.sanctions.forEach((s) => { + embed.addFields([ + { + name: s.type + " | #" + s.case, + value: `${interaction.translate("common:MODERATOR")}: <@${s.moderator}>\n${interaction.translate("common:REASON")}: ${s.reason}`, + inline: true + } + ]); + }); + } + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Warns; \ No newline at end of file diff --git a/index.js b/index.js index 7a4095c7..bf86938e 100644 --- a/index.js +++ b/index.js @@ -18,6 +18,6 @@ const client = new JaBa({ client.on("disconnect", () => client.logger.log("Bot is disconnecting...", "warn")) .on("reconnecting", () => client.logger.log("Bot reconnecting...", "warn")) - .on("error", (e) => client.logger.log(e, "error")) .on("warn", (info) => client.logger.log(info, "warn")); +// .on("error", (e) => client.logger.log(e, "error")) process.on("unhandledRejection", (err) => console.error(err)); \ No newline at end of file diff --git a/languages/ru-RU/moderation/warn.json b/languages/ru-RU/moderation/warn.json index 87bc0e04..b216924d 100644 --- a/languages/ru-RU/moderation/warn.json +++ b/languages/ru-RU/moderation/warn.json @@ -1,11 +1,11 @@ { - "DESCRIPTION": "Выдать предупреждение пользователю в ЛС", + "DESCRIPTION": "Выдать предупреждение пользователю", "USAGE": "warn [@пользователь] (причина)", "EXAMPLES": "warn @Jonny_Bro#4226 stupid", - "MISSING_MEMBER": "Вы должны упомянуть пользователя!", "YOURSELF": "Вы не можете подать жалобу на себя!", - "MISSING_REASON": "Укажите причину!", - "WARNED_DM": "Привет {{username}},\nвы получили предупреждение на сервере **{{server}}** от пользователя **{{moderator}}** по причине **{{reason}}**!", - "WARNED": "**{{username}}** получил предупреждение в ЛС по причине **{{reason}}**!", + "MODAL_TITLE": "Выдать предупреждение {{nickname}}", + "REASON": "Причина предупреждения", + "WARNED_DM": "Вы получили предупреждение на сервере **{{server}}** от пользователя **{{moderator}}** по причине **{{reason}}**!", + "WARNED": "**{{username}}** получил предупреждение по причине **{{reason}}**!", "CASE": "Предупрежение | Номер #{{caseNumber}}" } \ No newline at end of file diff --git a/languages/ru-RU/moderation/warns.json b/languages/ru-RU/moderation/warns.json index 91d0e5e9..1419c7e6 100644 --- a/languages/ru-RU/moderation/warns.json +++ b/languages/ru-RU/moderation/warns.json @@ -2,6 +2,6 @@ "DESCRIPTION": "Показать список нарушений пользователя!", "USAGE": "sanctions [@пользователь]", "EXAMPLES": "sanctions @Jonny_Bro#4226", - "MISSING_MEMBER": "Вы должны упомянуть пользователя!", - "NO_SANCTION": "У **{{username}}** нет нарушений." + "SANCTIONS_OF": "Нарушения {{member}}", + "NO_SANCTION": "У **{{member}}** нет нарушений." } \ No newline at end of file From 0f6bf647fb6b17aa7169b2d4e2b7777b8dff9423 Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Sun, 31 Jul 2022 20:43:08 +0500 Subject: [PATCH 09/16] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=B0=20activity=20discord-together=20=D1=83?= =?UTF-8?q?=D0=B4=D0=B0=D0=BB=D1=91=D0=BD,=20=D0=B8=D1=81=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D1=83=D1=8E=20=D0=B5=D0=B3=D0=BE=20=D0=BF?= =?UTF-8?q?=D0=B5=D1=80=D0=B5=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=D0=BD=D1=8B?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=BD=D0=BE=D1=8E=20=D0=B8=D1=81=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D0=BD=D0=B8=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/General/activity.js | 263 ------------------------ base/JaBa.js | 3 + commands/General/activity.js | 87 ++++++++ events/ready.js | 4 - helpers/discordTogether.js | 131 +++++++++++- languages/ru-RU/general/activity.json | 7 +- languages/ru-RU/general/emoji.json | 2 +- languages/ru-RU/general/help.json | 2 +- languages/ru-RU/general/minecraft.json | 2 +- languages/ru-RU/general/report.json | 2 +- languages/ru-RU/general/serverinfo.json | 2 +- languages/ru-RU/general/shorturl.json | 2 +- languages/ru-RU/general/staff.json | 2 +- languages/ru-RU/general/stats.json | 2 +- languages/ru-RU/general/suggest.json | 2 +- languages/ru-RU/general/userinfo.json | 2 +- languages/ru-RU/general/whois.json | 2 +- 17 files changed, 232 insertions(+), 285 deletions(-) delete mode 100644 TO REWRITE/General/activity.js create mode 100644 commands/General/activity.js diff --git a/TO REWRITE/General/activity.js b/TO REWRITE/General/activity.js deleted file mode 100644 index 1ddeb9b4..00000000 --- a/TO REWRITE/General/activity.js +++ /dev/null @@ -1,263 +0,0 @@ -const Command = require("../../base/Command"), - { PermissionsBitField } = require("discord.js"); - -class Activity extends Command { - constructor(client) { - super(client, { - name: "activity", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["act"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - - const perms = voice.permissionsFor(this.client.user); - if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); - - const activities = [ - "betrayal", - `checkers (${message.translate("general/activity:NO_BOOST")})`, - `chess (${message.translate("general/activity:NO_BOOST")})`, - "sketchheads", - `ocho (${message.translate("general/activity:NO_BOOST")})`, - "fishing", - "lettertile", - `poker (${message.translate("general/activity:NO_BOOST")})`, - `spellcast (${message.translate("general/activity:NO_BOOST")})`, - "wordsnack", - "puttparty", - "youtube" - ]; - const activity = args[0]; - - switch (activity) { - case "betrayal": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "betrayal").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Betrayal.io") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Betrayal.io", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "checkers": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "checkers").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Checkers In The Park") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Checkers In The Park", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "chess": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "chess").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Chess In The Park") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Chess In The Park", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "sketchheads": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "sketchheads").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Sketch Heads") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Sketch Heads", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "ocho": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "ocho").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Ocho") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Ocho", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "fishing": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "fishing").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Fishington.io") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Fishington.io", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "lettertile": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "lettertile").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Letter Tile") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Letter Tile", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "poker": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "poker").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Poker Night") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Poker Night", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "spellcast": - if (message.guild.premiumTier === "NONE") return message.error("general/activity:NO_BOOST"); - - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "spellcast").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Spell Cast") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Spell Cast", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "wordsnack": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "wordsnack").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Words Snack") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Words Snack", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "puttparty": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "puttparty").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Puttparty") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Puttparty", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - case "youtube": - this.client.discordTogether.createTogetherCode(message.member.voice.channelId, "youtube").then(async invite => { - const embed = new Discord.EmbedBuilder() - .setTitle("Youtube Together") - .setColor(data.config.embed.color) - .setDescription(`**[${message.translate("misc:CLICK_HERE", { activity: "Youtube Together", channel: voice.name })}](${invite.code})**`) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - }); - break; - - default: { - const embed = new Discord.EmbedBuilder() - .setTitle(message.translate("general/activity:TITLE")) - .setDescription(activities.join("\n")) - .setColor(data.config.embed.color) - .setFooter({ - text: message.translate("general/activity:FOOTER") - }) - .setTimestamp(); - message.reply({ - embeds: [embed] - }); - } - } - } -} - -module.exports = Activity; \ No newline at end of file diff --git a/base/JaBa.js b/base/JaBa.js index 570ca22e..a82fc85c 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -8,6 +8,7 @@ const { EmbedBuilder, Client, Collection, SlashCommandBuilder, ContextMenuComman const BaseEvent = require("./BaseEvent.js"), BaseCommand = require("./BaseCommand.js"), + { DiscordTogether } = require("../helpers/discordTogether"), AmeClient = require("amethyste-api"), path = require("path"), fs = require("fs").promises, @@ -49,6 +50,8 @@ class JaBa extends Client { if (this.config.apiKeys.amethyste) this.AmeAPI = new AmeClient(this.config.apiKeys.amethyste); + this.discordTogether = new DiscordTogether(this); + this.player = new DisTube.default(this, { plugins: [ new SpotifyPlugin({ diff --git a/commands/General/activity.js b/commands/General/activity.js new file mode 100644 index 00000000..2b464478 --- /dev/null +++ b/commands/General/activity.js @@ -0,0 +1,87 @@ +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField } = require("discord.js"), + { defaultApplications } = require("../../helpers/discordTogether"); +const BaseCommand = require("../../base/BaseCommand"); + +class Activity extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("activity") + .setDescription(client.translate("general/activity:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").CommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + + const perms = voice.permissionsFor(client.user); + if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT"); + + const activities = defaultApplications.map(a => { + return { + label: `${a.name} ${a.premium_tier_level ? `(${interaction.translate("general/activity:BOOST_NEEDED")})` : ""}`, + value: a.id + }; + }); + + const row = new ActionRowBuilder() + .addComponents( + new SelectMenuBuilder() + .setCustomId("activity_select") + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) + .addOptions(activities) + ); + + const msg = await interaction.reply({ + content: interaction.translate("general/activity:AVAILABLE_ACTIVITIES"), + components: [row], + fetchReply: true + }); + + const collector = new InteractionCollector(client, { + message: msg, + idle: 60 * 1000 + }); + + collector.on("collect", async (msg) => { + const activity = msg?.values[0]; + + const invite = await client.discordTogether.createTogetherCode(voice.id, activity); + const embed = new EmbedBuilder() + .setTitle(activity) + .setColor(client.config.embed.color) + .setDescription(`**[${interaction.translate("misc:CLICK_HERE", { activity: defaultApplications.find(a => a.id === activity).name, channel: voice.name })}](${invite.code})**`) + .setFooter({ + text: client.config.embed.footer + }) + .setTimestamp(); + + msg.update({ + embeds: [embed] + }); + }); + } +} + +module.exports = Activity; \ No newline at end of file diff --git a/events/ready.js b/events/ready.js index 2e767ced..1ec9e54b 100644 --- a/events/ready.js +++ b/events/ready.js @@ -23,10 +23,6 @@ class Ready extends BaseEvent { client.logger.log(`${client.user.tag}, ready to serve ${tUsers} users in ${tServers} servers.`, "ready"); client.logger.log(`Invite Link: ${client.generateInvite({ scopes: ["bot", "applications.commands"] , permissions: [ PermissionsBitField.Flags.Administrator ] })}`, "ready"); - // Discord Together - const discordtogether = require("../helpers/discordTogether"); - discordtogether.init(client); - // Birthday Announce const birthdays = require("../helpers/birthdays"); birthdays.init(client); diff --git a/helpers/discordTogether.js b/helpers/discordTogether.js index e7a2157b..41291add 100644 --- a/helpers/discordTogether.js +++ b/helpers/discordTogether.js @@ -1,4 +1,129 @@ -module.exports.init = function (client) { - const { DiscordTogether } = require("discord-together"); - client.discordTogether = new DiscordTogether(client); +/* + Thanks to discord-together =) + List of IDs from here: https://gist.github.com/GeneralSadaf/42d91a2b6a93a7db7a39208f2d8b53ad +*/ +const fetch = require("node-fetch"); + +const defaultApplications = [ + { id: "880218394199220334", name: "Watch Together", nitro_requirement: false, premium_tier_level: 0, max_participants: -1, use: true }, + { id: "902271654783242291", name: "Sketch Heads", nitro_requirement: false, premium_tier_level: 0, max_participants: 8, use: true }, + { id: "879863976006127627", name: "Word Snacks", nitro_requirement: false, premium_tier_level: 0, max_participants: 8, use: true }, + { id: "878067389634314250", name: "Doodle Crew", nitro_requirement: false, premium_tier_level: 0, max_participants: 16, use: true }, // not in Discord Games Lab guild + { id: "755827207812677713", name: "Poker Night", nitro_requirement: false, premium_tier_level: 1, max_participants: 7, use: true }, + { id: "832012774040141894", name: "Chess In The Park", nitro_requirement: false, premium_tier_level: 1, max_participants: -1, use: true }, + { id: "879863686565621790", name: "Letter League", nitro_requirement: false, premium_tier_level: 1, max_participants: 8, use: true }, + { id: "852509694341283871", name: "SpellCast", nitro_requirement: false, premium_tier_level: 1, max_participants: 6, use: true }, + { id: "832013003968348200", name: "Checkers In The Park", nitro_requirement: false, premium_tier_level: 1, max_participants: -1, use: true }, + { id: "832025144389533716", name: "Blazing 8s", nitro_requirement: false, premium_tier_level: 1, max_participants: 8, use: true }, + { id: "945737671223947305", name: "Putt Party", nitro_requirement: false, premium_tier_level: 1, max_participants: 8, use: true }, + { id: "903769130790969345", name: "Land-io", nitro_requirement: false, premium_tier_level: 1, max_participants: 16, use: true }, + { id: "947957217959759964", name: "Bobble League", nitro_requirement: false, premium_tier_level: 1, max_participants: 8, use: true }, + { id: "976052223358406656", name: "Ask Away", nitro_requirement: false, premium_tier_level: 1, max_participants: 10, use: true }, + { id: "950505761862189096", name: "Know What I Meme", nitro_requirement: false, premium_tier_level: 1, max_participants: 8, use: true }, + + // not public + /* + { id: "773336526917861400", name: "Betrayal.io", nitro_requirement: false, premium_tier_level: 0, max_participants: null, use: false }, + { id: "814288819477020702", name: "Fishington.io", nitro_requirement: false, premium_tier_level: 0, max_participants: null, use: false }, + { id: "879864070101172255", name: "Sketchy Artist", nitro_requirement: false, premium_tier_level: 0, max_participants: 12, use: false }, + { id: "879863881349087252", name: "Awkword", nitro_requirement: false, premium_tier_level: 0, max_participants: 12, use: false }, + */ +]; + +/** + * Class symbolizing a DiscordTogether + * @template {Object.} T + */ +class DiscordTogether { + /** + * Create a new DiscordTogether + * @param {import("../base/JaBa")} client + * @param {T} applications + * @example + * const Discord = require("discord.js"); + * const client = new Discord.Client({ intents: [Discord.Intents.FLAGS.GUILDS, Discord.Intents.FLAGS.GUILD_MESSAGES] }); + * const { DiscordTogether } = require("discord-together"); + * + * client.discordTogether = new DiscordTogether(client); + * + * client.on("message", async message => { + * if (message.content === "start") { + * client.discordTogether.createTogetherCode(message.member.voice.channelID, "puttparty").then(async invite => { + * return message.channel.send(`${invite.code}`); + * }); + * }; + * }); + * + * client.login("your token"); + */ + constructor(client) { + if (!client) throw new SyntaxError("Invalid Discord.Client !"); + + /** + * Discord.Client + */ + this.client = client; + + /** + * Discord Together applications + */ + this.applications = defaultApplications; + } + + /** + * Create a Discord Together invite code (note: send the invite using markdown link) + * @param {String} voiceChannelId + * @param {keyof (defaultApplications & T)} option + * @example + * client.on("message", async message => { + * if (message.content === "start") { + * client.discordTogether.createTogetherCode(message.member.voice.channelID, "youtube").then(async invite => { + * return message.channel.send(`${invite.code}`); // Click the blue link + * }); + * }; + * }); + * @returns {Promise<{ code: String; }>} + */ + async createTogetherCode(voiceChannelId, option) { + /** + * @param {String} code The invite link (only use the blue link) + */ + const returnData = { + code: "none", + }; + if (option && this.applications.find(apps => apps.id === option).id) { + const applicationID = this.applications.find(apps => apps.id === option).id; + try { + await fetch(`https://discord.com/api/v10/channels/${voiceChannelId}/invites`, { + method: "POST", + body: JSON.stringify({ + max_age: 86400, + max_uses: 0, + temporary: false, + target_type: 2, + target_application_id: applicationID + }), + headers: { + Authorization: `Bot ${this.client.config.token}`, + "Content-Type": "application/json", + }, + }).then((res) => res.json()) + .then((invite) => { + if (invite.error || !invite.code) throw new Error("An error occured while retrieving data !"); + if (Number(invite.code) === 50013) console.warn("Your bot lacks permissions to perform that action"); + returnData.code = `https://discord.com/invite/${invite.code}`; + }); + } catch (err) { + throw new Error("An error occured while starting Youtube together !"); + } + return returnData; + } else { + throw new SyntaxError("Invalid option !"); + } + } +} + +module.exports = { + DiscordTogether, + defaultApplications }; \ No newline at end of file diff --git a/languages/ru-RU/general/activity.json b/languages/ru-RU/general/activity.json index 9e2c8b15..913cb57e 100644 --- a/languages/ru-RU/general/activity.json +++ b/languages/ru-RU/general/activity.json @@ -1,8 +1,7 @@ { - "DESCRIPTION": "Создать активность в голосовом канале!", + "DESCRIPTION": "Создать активность в голосовом канале", "USAGE": "activity (активность)", "EXAMPLES": "activity\nactivity chess", - "TITLE": "Список доступных активностей", - "FOOTER": "JaBa | Discord Together", - "NO_BOOST": "Необходим первый уровень буста или выше!" + "AVAILABLE_ACTIVITIES": "Доступные активности:", + "BOOST_NEEDED": "Необходим первый уровень буста или выше!" } \ No newline at end of file diff --git a/languages/ru-RU/general/emoji.json b/languages/ru-RU/general/emoji.json index afcc8716..f2dc10b5 100644 --- a/languages/ru-RU/general/emoji.json +++ b/languages/ru-RU/general/emoji.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать информацию об эмодзи!", + "DESCRIPTION": "Показать информацию об эмодзи", "USAGE": "emoji [эмодзи]", "EXAMPLES": "emoji :tada:", "TITLE": "Информация об {{emoji}}", diff --git a/languages/ru-RU/general/help.json b/languages/ru-RU/general/help.json index 587dfeb0..95e0e0ce 100644 --- a/languages/ru-RU/general/help.json +++ b/languages/ru-RU/general/help.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать список команд или помощь по данной команде.", + "DESCRIPTION": "Показать список команд или помощь по данной команде", "USAGE": "help (команда)", "EXAMPLES": "help\nhelp ping", "CUSTOM": "У добавленных команд нет описания.", diff --git a/languages/ru-RU/general/minecraft.json b/languages/ru-RU/general/minecraft.json index 30e93152..4cd0a1c9 100644 --- a/languages/ru-RU/general/minecraft.json +++ b/languages/ru-RU/general/minecraft.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать информацию о Minecraft сервере!", + "DESCRIPTION": "Показать информацию о Minecraft сервере", "USAGE": "minecraft [IP]", "EXAMPLES": "minecraft mc.hypixel.net", "MISSING_IP": "Укажите IP сервера!", diff --git a/languages/ru-RU/general/report.json b/languages/ru-RU/general/report.json index aaf7c6d8..7daafbb1 100644 --- a/languages/ru-RU/general/report.json +++ b/languages/ru-RU/general/report.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Отправить жалобу в специальный канал!", + "DESCRIPTION": "Отправить жалобу в специальный канал", "USAGE": "report [@пользователь] (причина)", "EXAMPLES": "report @Jonny_Bro#4226 Нарушение правил", "MISSING_CHANNEL": "Канал для жалоб не настроен!", diff --git a/languages/ru-RU/general/serverinfo.json b/languages/ru-RU/general/serverinfo.json index b199ce6e..25359326 100644 --- a/languages/ru-RU/general/serverinfo.json +++ b/languages/ru-RU/general/serverinfo.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать информацию о сервере!", + "DESCRIPTION": "Показать информацию о сервере", "USAGE": "serverinfo [ID/название]", "EXAMPLES": "serverinfo кык\nserverinfo", "AFK_CHANNEL": "AFK канал", diff --git a/languages/ru-RU/general/shorturl.json b/languages/ru-RU/general/shorturl.json index dfb470dd..ba3b4414 100644 --- a/languages/ru-RU/general/shorturl.json +++ b/languages/ru-RU/general/shorturl.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Укоротить ссылку!", + "DESCRIPTION": "Укоротить ссылку", "USAGE": "shorturl [URL]", "EXAMPLES": "shorturl https://google.com", "MISSING_URL": "Введите ссылку!" diff --git a/languages/ru-RU/general/staff.json b/languages/ru-RU/general/staff.json index f760640b..6f5bd833 100644 --- a/languages/ru-RU/general/staff.json +++ b/languages/ru-RU/general/staff.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать список администрации сервера!", + "DESCRIPTION": "Показать список администрации сервера", "USAGE": "staff", "EXAMPLES": "staff", "TITLE": "Персонал {{guild}}", diff --git a/languages/ru-RU/general/stats.json b/languages/ru-RU/general/stats.json index 68c50bb5..e0406ded 100644 --- a/languages/ru-RU/general/stats.json +++ b/languages/ru-RU/general/stats.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать статистику бота!", + "DESCRIPTION": "Показать статистику бота", "USAGE": "stats", "EXAMPLES": "stats", "COUNTS_TITLE": "• __Статистика__", diff --git a/languages/ru-RU/general/suggest.json b/languages/ru-RU/general/suggest.json index 50f73607..1d1c6c6b 100644 --- a/languages/ru-RU/general/suggest.json +++ b/languages/ru-RU/general/suggest.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Отправить предложение в специальный канал!", + "DESCRIPTION": "Отправить предложение в специальный канал", "USAGE": "suggest [предложение]", "EXAMPLES": "suggest Новый канал #nsfw :smiling_imp:", "MISSING_CHANNEL": "Канал для предложений не настроен!", diff --git a/languages/ru-RU/general/userinfo.json b/languages/ru-RU/general/userinfo.json index 078a0986..e0e37fcc 100644 --- a/languages/ru-RU/general/userinfo.json +++ b/languages/ru-RU/general/userinfo.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Показать информацию о пользователе!", + "DESCRIPTION": "Показать информацию о пользователе", "USAGE": "userinfo (@пользователь/ID)", "EXAMPLES": "userinfo\nuserinfo @Jonny_Bro#4226\nuserinfo 281361531411890186", "INVALID_USER": "Пользователь с ID `{{search}}` не найден!", diff --git a/languages/ru-RU/general/whois.json b/languages/ru-RU/general/whois.json index 8c146dee..e7affe6c 100644 --- a/languages/ru-RU/general/whois.json +++ b/languages/ru-RU/general/whois.json @@ -1,5 +1,5 @@ { - "DESCRIPTION": "Получить информацию об IP адресе!", + "DESCRIPTION": "Получить информацию об IP адресе", "USAGE": "whois (IP)", "EXAMPLES": "whois 1.1.1.1", "NO_IP": "Укажите IP адрес!", From 34193eea4476b5b41cd1cbccc717ac8dec1fe90d Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Mon, 1 Aug 2022 20:06:09 +0500 Subject: [PATCH 10/16] =?UTF-8?q?help=20:poggersfish:=20=D0=9C=D0=B5=D0=BB?= =?UTF-8?q?=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/General/help.js | 139 --------------------- TO REWRITE/Moderation/announcement.js | 2 +- TO REWRITE/Moderation/poll.js | 2 +- base/JaBa.js | 33 +++-- commands/Fun/8ball.js | 2 +- commands/Fun/lmgtfy.js | 2 +- commands/Fun/lovecalc.js | 2 +- commands/Fun/memes.js | 4 +- commands/General/activity.js | 7 +- commands/General/help.js | 166 ++++++++++++++++++++++++++ commands/General/ping.js | 2 +- commands/Moderation/warn.js | 10 +- commands/NSFW/nsfw.js | 4 +- commands/Owner/debug.js | 2 +- commands/Owner/eval.js | 2 +- commands/Owner/reload.js | 4 +- commands/Owner/say.js | 2 +- commands/Owner/servers.js | 4 +- dashboard/utils.js | 1 - helpers/autoUpdateDocs.js | 4 +- languages/ru-RU/general/help.json | 5 +- languages/ru-RU/misc.json | 43 +++++++ languages/ru-RU/moderation/warn.json | 4 +- languages/ru-RU/moderation/warns.json | 4 +- languages/ru-RU/owner/reload.json | 1 - languages/uk-UA/misc.json | 45 +++++++ package.json | 1 + 27 files changed, 304 insertions(+), 193 deletions(-) delete mode 100644 TO REWRITE/General/help.js create mode 100644 commands/General/help.js diff --git a/TO REWRITE/General/help.js b/TO REWRITE/General/help.js deleted file mode 100644 index aae84a44..00000000 --- a/TO REWRITE/General/help.js +++ /dev/null @@ -1,139 +0,0 @@ -const Command = require("../../base/Command"), - { PermissionsBitField, EmbedBuilder } = require("discord.js"); - -class Help extends Command { - constructor(client) { - super(client, { - name: "help", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["h", "commands"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (args[0]) { - const isCustom = (message.guild && data.guild.customCommands ? data.guild.customCommands.find((c) => c.name === args[0]) : false); - - const cmd = this.client.commands.get(args[0]) || this.client.commands.get(this.client.aliases.get(args[0])); - if (!cmd && isCustom) { - return message.error("general/help:CUSTOM", { - cmd: args[0] - }); - } else if (!cmd) { - return message.error("general/help:NOT_FOUND", { - search: args[0] - }); - } - - const description = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:DESCRIPTION`); - const usage = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:USAGE`, { - prefix: message.guild ? data.guild.prefix : "" - }); - const examples = message.translate(`${cmd.help.category.toLowerCase()}/${cmd.help.name}:EXAMPLES`, { - prefix: message.guild ? data.guild.prefix : "" - }); - - const groupEmbed = new EmbedBuilder() - .setAuthor({ - name: message.translate("general/help:CMD_TITLE", { - cmd: cmd.help.name - }) - }) - .addFields([ - { - name: message.translate("general/help:FIELD_DESCRIPTION"), - value: description - }, - { - name: message.translate("general/help:FIELD_USAGE"), - value: usage - }, - { - name: message.translate("general/help:FIELD_EXAMPLES"), - value: examples - }, - { - name: message.translate("general/help:FIELD_ALIASES"), - value: cmd.help.aliases.length > 0 ? cmd.help.aliases.map(a => "`" + a + "`").join("\n") : message.translate("general/help:NO_ALIAS") - }, - { - name: message.translate("general/help:FIELD_PERMISSIONS"), - value: cmd.conf.memberPermissions.length > 0 ? cmd.conf.memberPermissions.map((p) => `\`${p}\``).join("\n") : message.translate("general/help:NO_REQUIRED_PERMISSION") - } - ]) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - return message.reply({ - embeds: [groupEmbed] - }); - } - - const categories = []; - const commands = this.client.commands; - - commands.forEach((command) => { - if (!categories.includes(command.help.category)) { - if (command.help.category === "Owner" && message.author.id !== data.config.owner.id) return; - categories.push(command.help.category); - } - }); - - const emojis = this.client.customEmojis; - - const embed = new EmbedBuilder() - .setDescription(message.translate("general/help:INFO", { - prefix: message.guild ? data.guild.prefix : "" - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - categories.sort().forEach((cat) => { - const tCommands = commands.filter((cmd) => cmd.help.category === cat); - embed.addFields([ - { - name: `${emojis.categories[cat.toLowerCase()]} ${cat} - (${tCommands.size})`, - value: `${tCommands.map((cmd) => `\`${cmd.help.name}\``).join(", ")}` - } - ]); - }); - - embed.addFields([ - { - name: "\u200B", - value: message.translate("misc:STATS_FOOTER", { - dashboardLink: this.client.config.dashboard.baseURL, - docsLink: `${this.client.config.dashboard.baseURL}/docs/`, - inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator] }), - donateLink: "https://qiwi.com/n/JONNYBRO/", - owner: data.config.owner.id - }) - } - ]); - embed.setAuthor({ - name: message.translate("general/help:TITLE", { - name: this.client.user.username - }), - iconURL: this.client.user.displayAvatarURL({ - size: 512, - format: "png" - }) - }); - - return message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Help; \ No newline at end of file diff --git a/TO REWRITE/Moderation/announcement.js b/TO REWRITE/Moderation/announcement.js index 35508fd4..0b7a3e2d 100644 --- a/TO REWRITE/Moderation/announcement.js +++ b/TO REWRITE/Moderation/announcement.js @@ -31,7 +31,7 @@ class Announcement extends Command { time: 240000 }); - collector.on("collect", async (tmsg) => { + collector.on("collect", async tmsg => { if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { tmsg.delete(); msg.delete(); diff --git a/TO REWRITE/Moderation/poll.js b/TO REWRITE/Moderation/poll.js index 79edc8f2..8b59985b 100644 --- a/TO REWRITE/Moderation/poll.js +++ b/TO REWRITE/Moderation/poll.js @@ -30,7 +30,7 @@ class Poll extends Command { time: 240000 }); - collector.on("collect", async (tmsg) => { + collector.on("collect", async tmsg => { if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { tmsg.delete(); msg.delete(); diff --git a/base/JaBa.js b/base/JaBa.js index a82fc85c..c0d5e62e 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -118,12 +118,27 @@ class JaBa extends Client { }); } + async init() { + this.login(this.config.token); + + mongoose.connect(this.config.mongoDB, { + useNewUrlParser: true, + useUnifiedTopology: true + }).then(() => { + this.logger.log("Connected to the Mongodb database.", "log"); + }).catch((err) => { + this.logger.log(`Unable to connect to the Mongodb database. Error: ${err}`, "error"); + }); + + const autoUpdateDocs = require("../helpers/autoUpdateDocs"); + autoUpdateDocs.update(this); + } + /** * * @param {String} dir * @returns */ - async loadCommands(dir) { const filePath = path.join(__dirname, dir); var folders = await fs.readdir(filePath); folders = folders.map(file => path.join(filePath, file)).filter(async (path) => { path = await fs.lstat(path); path.isDirectory(); }); @@ -244,22 +259,6 @@ class JaBa extends Client { } } - async init() { - this.login(this.config.token); - - mongoose.connect(this.config.mongoDB, { - useNewUrlParser: true, - useUnifiedTopology: true - }).then(() => { - this.logger.log("Connected to the Mongodb database.", "log"); - }).catch((err) => { - this.logger.log(`Unable to connect to the Mongodb database. Error: ${err}`, "error"); - }); - - const autoUpdateDocs = require("../helpers/autoUpdateDocs"); - autoUpdateDocs.update(this); - } - get defaultLanguage() { return this.languages.find(language => language.default).name; } diff --git a/commands/Fun/8ball.js b/commands/Fun/8ball.js index a996b944..db98900c 100644 --- a/commands/Fun/8ball.js +++ b/commands/Fun/8ball.js @@ -31,7 +31,7 @@ class Eightball extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { diff --git a/commands/Fun/lmgtfy.js b/commands/Fun/lmgtfy.js index 742ac26b..7a17b6d4 100644 --- a/commands/Fun/lmgtfy.js +++ b/commands/Fun/lmgtfy.js @@ -31,7 +31,7 @@ class LMGTFY extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { diff --git a/commands/Fun/lovecalc.js b/commands/Fun/lovecalc.js index 65d3f626..8de8e276 100644 --- a/commands/Fun/lovecalc.js +++ b/commands/Fun/lovecalc.js @@ -35,7 +35,7 @@ class Lovecalc extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { diff --git a/commands/Fun/memes.js b/commands/Fun/memes.js index ea635ec8..a681313e 100644 --- a/commands/Fun/memes.js +++ b/commands/Fun/memes.js @@ -28,7 +28,7 @@ class Memes extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { @@ -58,7 +58,7 @@ class Memes extends BaseCommand { idle: 60 * 1000 }); - collector.on("collect", async (msg) => { + collector.on("collect", async msg => { const tag = msg?.values[0]; const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); diff --git a/commands/General/activity.js b/commands/General/activity.js index 2b464478..0570fd6e 100644 --- a/commands/General/activity.js +++ b/commands/General/activity.js @@ -28,7 +28,7 @@ class Activity extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { @@ -64,7 +64,7 @@ class Activity extends BaseCommand { idle: 60 * 1000 }); - collector.on("collect", async (msg) => { + collector.on("collect", async msg => { const activity = msg?.values[0]; const invite = await client.discordTogether.createTogetherCode(voice.id, activity); @@ -78,7 +78,8 @@ class Activity extends BaseCommand { .setTimestamp(); msg.update({ - embeds: [embed] + embeds: [embed], + components: [] }); }); } diff --git a/commands/General/help.js b/commands/General/help.js new file mode 100644 index 00000000..ec4e17be --- /dev/null +++ b/commands/General/help.js @@ -0,0 +1,166 @@ +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Help extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("help") + .setDescription(client.translate("general/help:DESCRIPTION")) + .addStringOption(option => + option.setName("command") + .setDescription(client.translate("owner/reload:COMMAND"))), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const commands = [...new Map(client.commands.map(v => [v.constructor.name, v])).values()]; + const categories = []; + const command = interaction.options.getString("command"); + + if (command) { + const embed = generateCommandHelp(client, interaction, command); + + return interaction.reply({ + embeds: [embed] + }); + } + + commands.forEach(c => { + if (!categories.includes(c.category)) { + if (c.category === "Owner" && interaction.user.id !== client.config.owner.id) return; + categories.push(c.category); + } + }); + + const categoriesRows = categories.sort().map(c => { + return { + label: `${c} (${commands.filter(cmd => cmd.category === c).length})`, + value: c + }; + }); + + const row = new ActionRowBuilder() + .addComponents( + new SelectMenuBuilder() + .setCustomId("help_category_select") + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) + .addOptions(categoriesRows) + ); + + const msg = await interaction.reply({ + content: interaction.translate("common:AVAILABLE_CATEGORIES"), + components: [row], + fetchReply: true + }); + + const collector = new InteractionCollector(client, { + message: msg, + idle: 60 * 1000 + }); + + collector.on("collect", async msg => { + const arg = msg?.values[0]; + + if (categories.find(c => c === arg)) { + const categoryCommands = commands.filter(cmd => cmd.category === arg).map(c => { + return { + label: c.command.name, + value: c.command.name + }; + }); + + const commandsRow = new ActionRowBuilder() + .addComponents( + new SelectMenuBuilder() + .setCustomId("help_commands_select") + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) + .addOptions(categoryCommands) + ); + + await msg.update({ + content: interaction.translate("general/help:COMMANDS_IN", { + category: arg + }), + components: [commandsRow], + fetchReply: true + }); + } else { + const embed = generateCommandHelp(client, interaction, arg); + return msg.update({ + content: null, + components: [], + embeds: [embed] + }); + } + }); + } +} + +function getPermName(bitfield = 0) { + for (const key in PermissionsBitField.Flags) + if (PermissionsBitField.Flags[key] === BigInt(bitfield)) return key; + return null; +} + +function generateCommandHelp(client, interaction, command) { + const cmd = client.commands.get(command); + if (!cmd) return interaction.error("general/help:NOT_FOUND", { search: command }); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("general/help:CMD_TITLE", { + cmd: cmd.command.name + }) + }) + .addFields([ + { + name: interaction.translate("general/help:FIELD_DESCRIPTION"), + value: interaction.translate(`${cmd.category.toLowerCase()}/${cmd.command.name}:DESCRIPTION`) + }, + { + name: interaction.translate("general/help:FIELD_USAGE"), + value: interaction.translate(`${cmd.category.toLowerCase()}/${cmd.command.name}:USAGE`) + }, + { + name: interaction.translate("general/help:FIELD_EXAMPLES"), + value: interaction.translate(`${cmd.category.toLowerCase()}/${cmd.command.name}:EXAMPLES`) + }, + { + name: interaction.translate("general/help:FIELD_ALIASES"), + value: cmd.aliases.length > 0 ? cmd.aliases.map(a => `${a}`).join("\n") : interaction.translate("general/help:NO_ALIAS") + }, + { + name: interaction.translate("general/help:FIELD_PERMISSIONS"), + value: cmd.command.default_member_permissions > 0 ? interaction.translate(`misc:PERMISSIONS:${getPermName(cmd.command.default_member_permissions)}`) : interaction.translate("general/help:NO_REQUIRED_PERMISSION") + } + ]) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + return embed; +} + +module.exports = Help; \ No newline at end of file diff --git a/commands/General/ping.js b/commands/General/ping.js index 778f16c5..8884393d 100644 --- a/commands/General/ping.js +++ b/commands/General/ping.js @@ -27,7 +27,7 @@ class Ping extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { diff --git a/commands/Moderation/warn.js b/commands/Moderation/warn.js index 475deb5a..da742882 100644 --- a/commands/Moderation/warn.js +++ b/commands/Moderation/warn.js @@ -32,19 +32,17 @@ class Warn extends BaseCommand { */ async execute(client, interaction, data) { const member = interaction.targetMember; + const memberPosition = member.roles.highest.position; + const moderationPosition = interaction.member.roles.highest.position; if (member.user.bot) return; + if (member.id === interaction.user.id) return interaction.error("moderation/warn:YOURSELF"); + if (interaction.guild.ownerId !== interaction.user.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/ban:SUPERIOR"); const memberData = await client.findOrCreateMember({ id: member.id, guildID: interaction.guildId }); - if (member.id === interaction.user.id) return interaction.error("moderation/warn:YOURSELF"); - - const memberPosition = member.roles.highest.position; - const moderationPosition = interaction.member.roles.highest.position; - if (interaction.guild.ownerId !== interaction.user.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/ban:SUPERIOR"); - const modal = new ModalBuilder() .setCustomId("warn_modal") .setTitle(interaction.translate("moderation/warn:MODAL_TITLE")); diff --git a/commands/NSFW/nsfw.js b/commands/NSFW/nsfw.js index 7fed0963..5a0c0197 100644 --- a/commands/NSFW/nsfw.js +++ b/commands/NSFW/nsfw.js @@ -28,7 +28,7 @@ class NSFW extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { @@ -61,7 +61,7 @@ class NSFW extends BaseCommand { idle: 60 * 1000 }); - collector.on("collect", async (msg) => { + collector.on("collect", async msg => { const tag = msg?.values[0]; const res = await fetch(`https://meme-api.herokuapp.com/gimme/${tag}`).then(response => response.json()); diff --git a/commands/Owner/debug.js b/commands/Owner/debug.js index 4b9ef9e7..21482301 100644 --- a/commands/Owner/debug.js +++ b/commands/Owner/debug.js @@ -73,7 +73,7 @@ class Debug extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction, data) { diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js index d219584b..30e83b0f 100644 --- a/commands/Owner/eval.js +++ b/commands/Owner/eval.js @@ -32,7 +32,7 @@ class Eval extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction, data) { diff --git a/commands/Owner/reload.js b/commands/Owner/reload.js index c04aa4c4..de1fe5e2 100644 --- a/commands/Owner/reload.js +++ b/commands/Owner/reload.js @@ -33,13 +33,13 @@ class Reload extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { const command = interaction.options.getString("command"); const cmd = client.commands.get(command); - if (!cmd) return interaction.error("owner/reload:NOT_FOUND", { search: command }, { ephemeral: true }); + if (!cmd) return interaction.error("general/help:NOT_FOUND", { search: command }, { ephemeral: true }); await client.unloadCommand(`../commands/${cmd.category}`, cmd.command.name); await client.loadCommand(`../commands/${cmd.category}`, cmd.command.name); diff --git a/commands/Owner/say.js b/commands/Owner/say.js index 536e8399..b42a6f52 100644 --- a/commands/Owner/say.js +++ b/commands/Owner/say.js @@ -34,7 +34,7 @@ class Say extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { diff --git a/commands/Owner/servers.js b/commands/Owner/servers.js index 26b52970..4e90f222 100644 --- a/commands/Owner/servers.js +++ b/commands/Owner/servers.js @@ -27,7 +27,7 @@ class Servers extends BaseCommand { /** * * @param {import("../../base/JaBa")} client - * @param {import("discord.js").CommandInteraction} interaction + * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ async execute(client, interaction) { @@ -72,7 +72,7 @@ class Servers extends BaseCommand { time: 60 * 1000 }); - collector.on("collect", async (reaction) => { + collector.on("collect", async reaction => { if (reaction._emoji.name === "⬅") { i0 = i0 - 10; i1 = i1 - 10; diff --git a/dashboard/utils.js b/dashboard/utils.js index e89d8922..432b5d5f 100644 --- a/dashboard/utils.js +++ b/dashboard/utils.js @@ -11,7 +11,6 @@ async function fetchUser(userData, client, query) { if (userData.guilds) { userData.guilds.forEach((guild) => { if (!client.guilds.cache.get(guild.id)) return; - // eslint-disable-next-line no-undef const perms = new PermissionsBitField(BigInt(guild.permissions)); if (perms.has(PermissionsBitField.Flags.ManageGuild)) guild.admin = true; diff --git a/helpers/autoUpdateDocs.js b/helpers/autoUpdateDocs.js index a350e11d..1e069f78 100644 --- a/helpers/autoUpdateDocs.js +++ b/helpers/autoUpdateDocs.js @@ -18,11 +18,11 @@ module.exports.update = function (client) { // else return 1; // }) - categories.sort().forEach((cat) => { + categories.sort().forEach(cat => { const categoriesArray = [ ["Название", "Описание", "Использование", "Разрешено использование"] ]; - const cmds = [...new Map(commands.filter((cmd) => cmd.category === cat).map(v => [v.constructor.name, v])).values()]; + const cmds = [...new Map(commands.filter(cmd => cmd.category === cat).map(v => [v.constructor.name, v])).values()]; text += `### ${cat} (${cmds.length} ${client.getNoun(cmds.length, "команда", "команды", "команд")})\n\n`; cmds.sort(function (a, b) { diff --git a/languages/ru-RU/general/help.json b/languages/ru-RU/general/help.json index 95e0e0ce..ffd78aa5 100644 --- a/languages/ru-RU/general/help.json +++ b/languages/ru-RU/general/help.json @@ -2,8 +2,8 @@ "DESCRIPTION": "Показать список команд или помощь по данной команде", "USAGE": "help (команда)", "EXAMPLES": "help\nhelp ping", - "CUSTOM": "У добавленных команд нет описания.", - "NOT_FOUND": "Команды `{{search}}` не существует", + "NOT_FOUND": "Команды `{{search}}` не существует.", + "COMMANDS_IN": "Доступные команды в категории `{{category}}`:", "FIELD_USAGE": "Использование", "FIELD_DESCRIPTION": "Описание", "FIELD_ALIASES": "Сокращения", @@ -11,7 +11,6 @@ "NO_ALIAS": "Нет сокращений", "CMD_TITLE": "Помощь по {{cmd}}", "INFO": "● Чтобы получить помощь по определённой команде используйте `help <команда>`!", - "CUSTOM_COMMANDS": "Добавленные команды", "FIELD_PERMISSIONS": "Необходимые права", "NO_REQUIRED_PERMISSION": "Никаких особых прав не нужно для использования данной команды.", "TITLE": "{{name}} | Команды" diff --git a/languages/ru-RU/misc.json b/languages/ru-RU/misc.json index c99c8b93..cc3a54ce 100644 --- a/languages/ru-RU/misc.json +++ b/languages/ru-RU/misc.json @@ -25,6 +25,49 @@ "COOLDOWNED": "Подождите **{{seconds}}**, чтобы снова использовать эту команду!", "CANNOT_DM": "Я не могу отправить вам личное сообщение... Проверьте свои настройки конфиденциальности!", + "PERMISSIONS": { + "CreateInstantInvite": "Создание приглашения", + "KickMembers": "Выгонять участников", + "BanMembers": "Банить участников", + "Administrator": "Администратор", + "ManageChannels": "Управлять каналами", + "ManageGuild": "Управлять сервером", + "AddReactions": "Добавлять реакции", + "ViewAuditLog": "Просматривать журнал аудита", + "PrioritySpeaker": "Приоритетный режим", + "Stream": "Видео", + "ViewChannel": "Просматривать каналы", + "SendMessages": "Отправлять сообщения", + "SendTTSMessages": "Отправка сообщений text-to-speech", + "ManageMessages": "Управлять сообщениями", + "EmbedLinks": "Встраивать ссылки", + "AttachFiles": "Прикреплять файлы", + "ReadMessageHistory": "Читать историю сообщений", + "MentionEveryone": "Упоминание *@*everyone, *@*here и всех ролей", + "UseExternalEmojis": "Использовать внешние эмодзи", + "ViewGuildInsights": "Просматривать статистику сервера", + "Connect": "Подключаться", + "Speak": "Говорить", + "MuteMembers": "Отключать участникам микрофон", + "DeafenMembers": "Отключать участникам звук", + "MoveMembers": "Перемещать участников", + "UseVAD": "Использовать режим активации по голосу", + "ChangeNickname": "Изменить никнейм", + "ManageNicknames": "Управлять никнеймами", + "ManageRoles": "Управлять ролями", + "ManageWebhooks": "Управлять вебхуками (webhooks)", + "ManageEmojisAndStickers": "Управлять эмодзи и стикерами", + "UseApplicationCommands": "Использовать команды приложения", + "ManageEvents": "Управление событиями", + "ManageThreads": "Управление ветками", + "CreatePublicThreads": "Создать публичные ветки", + "CreatePrivateThreads": "Создание приватных веток", + "UseExternalStickers": "Использовать внешние стикеры", + "SendMessagesInThreads": "Отправлять сообщения в ветках", + "UseEmbeddedActivities": "Начать активность", + "ModerateMembers": "Отправить участников подумать о своём поведении" + }, + "NOUNS": { "CREDIT": { "1": "кредит", diff --git a/languages/ru-RU/moderation/warn.json b/languages/ru-RU/moderation/warn.json index b216924d..7436603f 100644 --- a/languages/ru-RU/moderation/warn.json +++ b/languages/ru-RU/moderation/warn.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Выдать предупреждение пользователю", - "USAGE": "warn [@пользователь] (причина)", - "EXAMPLES": "warn @Jonny_Bro#4226 stupid", + "USAGE": "ПКМ на пользователя - Приложения - warn", + "EXAMPLES": "", "YOURSELF": "Вы не можете подать жалобу на себя!", "MODAL_TITLE": "Выдать предупреждение {{nickname}}", "REASON": "Причина предупреждения", diff --git a/languages/ru-RU/moderation/warns.json b/languages/ru-RU/moderation/warns.json index 1419c7e6..4d7e0c1b 100644 --- a/languages/ru-RU/moderation/warns.json +++ b/languages/ru-RU/moderation/warns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать список нарушений пользователя!", - "USAGE": "sanctions [@пользователь]", - "EXAMPLES": "sanctions @Jonny_Bro#4226", + "USAGE": "ПКМ на пользователя - Приложения - warns", + "EXAMPLES": "", "SANCTIONS_OF": "Нарушения {{member}}", "NO_SANCTION": "У **{{member}}** нет нарушений." } \ No newline at end of file diff --git a/languages/ru-RU/owner/reload.json b/languages/ru-RU/owner/reload.json index 47d5aba5..b71f43bc 100644 --- a/languages/ru-RU/owner/reload.json +++ b/languages/ru-RU/owner/reload.json @@ -2,6 +2,5 @@ "DESCRIPTION": "Перезагрузить команду!", "COMMAND": "Команда", "EXAMPLES": "reload help", - "NOT_FOUND": "Команды `{{search}}` не существует!", "SUCCESS": "Команда `{{command}}` успешно перезагружена!" } \ No newline at end of file diff --git a/languages/uk-UA/misc.json b/languages/uk-UA/misc.json index d1107569..e4194d45 100644 --- a/languages/uk-UA/misc.json +++ b/languages/uk-UA/misc.json @@ -27,6 +27,51 @@ "COOLDOWNED": "Зачекайте **{{seconds}}**, щоб знову використати цю команду!", "CANNOT_DM": "Я не можу надіслати вам особисте повідомлення... Перевірте налаштування конфіденційності!", + "PERMISSIONS": { + "CREATE_INSTANT_INVITE": "Створення запрошення", + "KICK_MEMBERS": "Виганяти учасників", + "BAN_MEMBERS": "Банити учасників", + "ADMINISTRATOR": "Адміністратор", + "MANAGE_CHANNELS": "Керувати каналами", + "MANAGE_GUILD": "Керувати сервером", + "ADD_REACTIONS": "Додавати реакції", + "VIEW_AUDIT_LOG": "Перегляд журналу аудиту", + "PRIORITY_SPEAKER": "Пріоритетний режим", + "STREAM": "Відео", + "VIEW_CHANNEL": "Перегляд каналів", + "SEND_MESSAGES": "Надсилати повідомлення", + "SEND_TTS_MESSAGES": "Надсилання повідомлень text-to-speech", + "MANAGE_MESSAGES": "Керувати повідомленнями", + "EMBED_LINKS": "Вбудовувати посилання", + "ATTACH_FILES": "Прикріплювати файли", + "READ_MESSAGE_HISTORY": "Читати історію повідомлень", + "MENTION_EVERYONE": "Згадка *@*everyone, *@*here та всіх ролей", + "USE_EXTERNAL_EMOJIS": "Використовувати зовнішні емодзі", + "VIEW_GUILD_INSIGHTS": "Перегляд статистики сервера", + "CONNECT": "Підключатися", + "SPEAK": "Говорити", + "MUTE_MEMBERS": "Вимкнути учасникам мікрофон", + "DEAFEN_MEMBERS": "Вимкнути учасникам звук", + "MOVE_MEMBERS": "Переміщувати учасників", + "USE_VAD": "Використовувати режим активації за голосом", + "CHANGE_NICKNAME": "Змінити нікнейм", + "MANAGE_NICKNAMES": "Керувати нікнеймами", + "MANAGE_ROLES": "Керувати ролями", + "MANAGE_WEBHOOKS": "Керувати вебхуками (webhooks)", + "MANAGE_EMOJIS_AND_STICKERS": "Керувати емодзі та стікерами", + "USE_APPLICATION_COMMANDS": "Використовувати команди програми", + "MANAGE_EVENTS": "Управління подіями", + "MANAGE_THREADS": "Керування гілками", + "USE_PUBLIC_THREADS": "Використовувати публічні гілки", + "CREATE_PUBLIC_THREADS": "Створити публічні гілки", + "USE_PRIVATE_THREADS": "Використання приватних гілок", + "CREATE_PRIVATE_THREADS": "Створення приватних гілок", + "USE_EXTERNAL_STICKERS": "Використовувати зовнішні стікери", + "SEND_MESSAGES_IN_THREADS": "Надсилати повідомлення у гілках", + "START_EMBEDDED_ACTIVITIES": "Почати активність", + "MODERATE_MEMBERS": "Надіслати учасників подумати про свою поведінку" + }, + "NOUNS": { "CREDIT": { "1": "кредит", diff --git a/package.json b/package.json index bb1f5148..591f4e51 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "env": { "commonjs": true, "es6": true, + "es2020": true, "node": true }, "extends": "eslint:recommended", From ed8cc4f0be174e73290860c83b1c4bfa93a25150 Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Tue, 2 Aug 2022 17:18:47 +0500 Subject: [PATCH 11/16] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=8F=20Music=20=D0=9C=D0=B5=D0=BB=D0=BA=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/Economy/money.js | 4 +- TO REWRITE/Economy/profile.js | 4 +- TO REWRITE/Economy/transactions.js | 4 +- TO REWRITE/Economy/work.js | 4 +- TO REWRITE/General/report.js | 4 +- TO REWRITE/General/suggest.js | 2 +- TO REWRITE/General/userinfo.js | 8 +- TO REWRITE/Moderation/announcement.js | 99 --------------- TO REWRITE/Music/autoplay.js | 32 ----- TO REWRITE/Music/back.js | 50 -------- TO REWRITE/Music/clip.js | 58 --------- TO REWRITE/Music/clips.js | 46 ------- TO REWRITE/Music/jump.js | 53 -------- TO REWRITE/Music/loop.js | 40 ------ TO REWRITE/Music/np.js | 77 ------------ TO REWRITE/Music/pause.js | 32 ----- TO REWRITE/Music/play.js | 45 ------- TO REWRITE/Music/queue.js | 72 ----------- TO REWRITE/Music/resume.js | 32 ----- TO REWRITE/Music/seek.js | 35 ------ TO REWRITE/Music/skip.js | 52 -------- TO REWRITE/Music/stop.js | 48 -------- TO REWRITE/queue.js | 115 ++++++++++++++++++ base/Guild.js | 5 - base/JaBa.js | 2 +- commands/Fun/lovecalc.js | 2 +- commands/Fun/memes.js | 5 +- commands/General/activity.js | 5 +- commands/General/help.js | 7 +- commands/Moderation/warn.js | 8 +- commands/Moderation/warns.js | 4 +- commands/Music/autoplay.js | 46 +++++++ commands/Music/back.js | 59 +++++++++ commands/Music/clips.js | 114 +++++++++++++++++ commands/Music/jump.js | 65 ++++++++++ commands/Music/loop.js | 90 ++++++++++++++ commands/Music/nowplaying.js | 88 ++++++++++++++ commands/Music/play.js | 64 ++++++++++ commands/Music/seek.js | 54 ++++++++ commands/Music/skip.js | 61 ++++++++++ commands/Music/stop.js | 57 +++++++++ commands/NSFW/nsfw.js | 5 +- commands/Owner/announcement.js | 69 +++++++++++ commands/Owner/eval.js | 4 +- commands/Owner/servers.js | 8 +- events/CommandHandler.js | 2 +- events/Guild/guildCreate.js | 13 +- events/Guild/guildDelete.js | 6 +- events/Guild/guildMemberAdd.js | 27 ++-- events/Guild/guildMemberRemove.js | 25 ++-- events/Guild/guildMemberUpdate.js | 11 +- helpers/birthdays.js | 4 +- languages/ru-RU/moderation/announcement.json | 10 -- languages/ru-RU/music/clip.json | 9 -- languages/ru-RU/music/clips.json | 5 +- languages/ru-RU/music/jump.json | 4 +- languages/ru-RU/music/loop.json | 12 +- .../ru-RU/music/{np.json => nowplaying.json} | 6 +- languages/ru-RU/music/pause.json | 6 - languages/ru-RU/music/play.json | 4 +- languages/ru-RU/music/queue.json | 3 + languages/ru-RU/music/resume.json | 6 - languages/ru-RU/music/seek.json | 4 +- languages/ru-RU/owner/announcement.json | 8 ++ languages/ru-RU/owner/reload.json | 1 + .../{moderation => owner}/announcement.json | 0 package-lock.json | 67 +++++++--- package.json | 9 +- 68 files changed, 1054 insertions(+), 926 deletions(-) delete mode 100644 TO REWRITE/Moderation/announcement.js delete mode 100644 TO REWRITE/Music/autoplay.js delete mode 100644 TO REWRITE/Music/back.js delete mode 100644 TO REWRITE/Music/clip.js delete mode 100644 TO REWRITE/Music/clips.js delete mode 100644 TO REWRITE/Music/jump.js delete mode 100644 TO REWRITE/Music/loop.js delete mode 100644 TO REWRITE/Music/np.js delete mode 100644 TO REWRITE/Music/pause.js delete mode 100644 TO REWRITE/Music/play.js delete mode 100644 TO REWRITE/Music/queue.js delete mode 100644 TO REWRITE/Music/resume.js delete mode 100644 TO REWRITE/Music/seek.js delete mode 100644 TO REWRITE/Music/skip.js delete mode 100644 TO REWRITE/Music/stop.js create mode 100644 TO REWRITE/queue.js create mode 100644 commands/Music/autoplay.js create mode 100644 commands/Music/back.js create mode 100644 commands/Music/clips.js create mode 100644 commands/Music/jump.js create mode 100644 commands/Music/loop.js create mode 100644 commands/Music/nowplaying.js create mode 100644 commands/Music/play.js create mode 100644 commands/Music/seek.js create mode 100644 commands/Music/skip.js create mode 100644 commands/Music/stop.js create mode 100644 commands/Owner/announcement.js delete mode 100644 languages/ru-RU/moderation/announcement.json delete mode 100644 languages/ru-RU/music/clip.json rename languages/ru-RU/music/{np.json => nowplaying.json} (86%) delete mode 100644 languages/ru-RU/music/pause.json delete mode 100644 languages/ru-RU/music/resume.json create mode 100644 languages/ru-RU/owner/announcement.json rename languages/uk-UA/{moderation => owner}/announcement.json (100%) diff --git a/TO REWRITE/Economy/money.js b/TO REWRITE/Economy/money.js index b9c3b3bb..0b425da9 100644 --- a/TO REWRITE/Economy/money.js +++ b/TO REWRITE/Economy/money.js @@ -54,8 +54,8 @@ class Money extends Command { username: member.user.username }), iconURL: member.user.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .addFields([ diff --git a/TO REWRITE/Economy/profile.js b/TO REWRITE/Economy/profile.js index 3600f108..93c3db44 100644 --- a/TO REWRITE/Economy/profile.js +++ b/TO REWRITE/Economy/profile.js @@ -57,8 +57,8 @@ class Profile extends Command { username: member.user.tag }), iconURL: member.user.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .setImage("attachment://achievements.png") diff --git a/TO REWRITE/Economy/transactions.js b/TO REWRITE/Economy/transactions.js index 316ac760..6f82685c 100644 --- a/TO REWRITE/Economy/transactions.js +++ b/TO REWRITE/Economy/transactions.js @@ -22,8 +22,8 @@ class Transactions extends Command { .setAuthor({ name: message.translate("economy/transactions:EMBED_TRANSACTIONS"), iconURL: message.author.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .setColor(data.config.embed.color) diff --git a/TO REWRITE/Economy/work.js b/TO REWRITE/Economy/work.js index 218e57cf..283cbbc1 100644 --- a/TO REWRITE/Economy/work.js +++ b/TO REWRITE/Economy/work.js @@ -43,8 +43,8 @@ class Work extends Command { .setFooter({ text: message.translate("economy/work:AWARD"), iconURL: message.author.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .setColor(data.config.embed.color); diff --git a/TO REWRITE/General/report.js b/TO REWRITE/General/report.js index e616953f..ab294c42 100644 --- a/TO REWRITE/General/report.js +++ b/TO REWRITE/General/report.js @@ -36,8 +36,8 @@ class Report extends Command { user: member.user.tag }), iconURL: message.author.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .addFields([ diff --git a/TO REWRITE/General/suggest.js b/TO REWRITE/General/suggest.js index c7a3eabb..e5f798d0 100644 --- a/TO REWRITE/General/suggest.js +++ b/TO REWRITE/General/suggest.js @@ -32,8 +32,8 @@ class Suggest extends Command { user: message.author.username }), iconURL: message.author.displayAvatarURL({ + extension: "png", size: 512, - format: "png" }) }) .addFields([ diff --git a/TO REWRITE/General/userinfo.js b/TO REWRITE/General/userinfo.js index 5f292485..d7950f7e 100644 --- a/TO REWRITE/General/userinfo.js +++ b/TO REWRITE/General/userinfo.js @@ -43,8 +43,8 @@ class Userinfo extends Command { .setAuthor({ name: `${user.tag} (${user.id})`, iconURL: user.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .setThumbnail(user.displayAvatarURL()) @@ -72,8 +72,8 @@ class Userinfo extends Command { { name: this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), value: member.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) } ]) diff --git a/TO REWRITE/Moderation/announcement.js b/TO REWRITE/Moderation/announcement.js deleted file mode 100644 index 0b7a3e2d..00000000 --- a/TO REWRITE/Moderation/announcement.js +++ /dev/null @@ -1,99 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Announcement extends Command { - constructor(client) { - super(client, { - name: "announcement", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["ann"], - memberPermissions: ["MENTION_EVERYONE"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const text = args.join(" "); - if (!text) return message.error("moderation/announcement:MISSING_TEXT"); - if (text.length > 1030) return message.error("moderation/announcement:TOO_LONG"); - - let mention = null; - const msg = await message.sendT("moderation/announcement:MENTION_PROMPT"); - - const filter = m => m.author.id === message.author.id; - const collector = new Discord.MessageCollector(message.channel, { - filter, - time: 240000 - }); - - collector.on("collect", async tmsg => { - if (tmsg.content.toLowerCase() === message.translate("common:NO").toLowerCase()) { - tmsg.delete(); - msg.delete(); - collector.stop(true); - - if (message.deletable) message.delete(); - } - - if (tmsg.content.toLowerCase() === message.translate("common:YES").toLowerCase()) { - tmsg.delete(); - msg.delete(); - const tmsg1 = await message.channel.send(message.translate("moderation/announcement:MENTION_TYPE_PROMPT")); - - const filter = m => m.author.id === message.author.id; - const c = new Discord.MessageCollector(message.channel, { - filter, - time: 60000 - }); - c.on("collect", (m) => { - if (m.content.toLowerCase() === "here") { - mention = "@here"; - tmsg1.delete(); - m.delete(); - collector.stop(true); - c.stop(true); - } else if (m.content.toLowerCase() === "everyone") { - mention = "@everyone"; - tmsg1.delete(); - m.delete(); - collector.stop(true); - c.stop(true); - } - }); - - c.on("end", (collected, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - }); - - if (message.deletable) message.delete(); - } - }); - - collector.on("end", (collected, reason) => { - if (reason === "time") return message.error("misc:TIMES_UP"); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("moderation/announcement:TITLE") - }) - .setColor(data.config.embed.color) - .setFooter({ - text: message.author.tag - }) - .setTimestamp() - .setDescription(text); - - message.channel.send({ - content: mention, - embeds: [embed] - }); - }); - } -} - -module.exports = Announcement; \ No newline at end of file diff --git a/TO REWRITE/Music/autoplay.js b/TO REWRITE/Music/autoplay.js deleted file mode 100644 index 2372c601..00000000 --- a/TO REWRITE/Music/autoplay.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require("../../base/Command"); - -class AutoPlay extends Command { - constructor(client) { - super(client, { - name: "autoplay", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["autop"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const autoplay = queue.toggleAutoplay(); - - message.success(`music/autoplay:SUCCESS_${autoplay ? "ENABLED" : "DISABLED"}`); - } -} - -module.exports = AutoPlay; \ No newline at end of file diff --git a/TO REWRITE/Music/back.js b/TO REWRITE/Music/back.js deleted file mode 100644 index 5340b1c5..00000000 --- a/TO REWRITE/Music/back.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Back extends Command { - constructor(client) { - super(client, { - name: "back", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["previous"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (!queue.previousSongs[0]) return message.error("music/back:NO_PREV_SONG"); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("music/back:DESCRIPTION") - }) - .setThumbnail(queue.tracks[0].thumbnail) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.previous(message); - embed.setDescription(message.translate("music/back:SUCCESS")); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Back; \ No newline at end of file diff --git a/TO REWRITE/Music/clip.js b/TO REWRITE/Music/clip.js deleted file mode 100644 index de287a0e..00000000 --- a/TO REWRITE/Music/clip.js +++ /dev/null @@ -1,58 +0,0 @@ -const Command = require("../../base/Command"), - fs = require("fs"), - { joinVoiceChannel, createAudioResource, createAudioPlayer, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice"); - -class Clip extends Command { - constructor(client) { - super(client, { - name: "clip", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - const clip = args[0]; - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (getVoiceConnection(message.guild.id)) return message.error("music/clip:ACTIVE_CLIP"); - if (queue) return message.error("music/clip:ACTIVE_QUEUE"); - if (!clip) return message.error("music/clip:NO_ARG"); - if (!fs.existsSync(`./clips/${clip}.mp3`)) return message.error("music/clip:NO_FILE", { file: clip }); - - try { - const connection = joinVoiceChannel({ - channelId: voice.id, - guildId: message.guild.id, - adapterCreator: message.guild.voiceAdapterCreator - }); - - const resource = createAudioResource(fs.createReadStream(`./clips/${clip}.mp3`)); - const player = createAudioPlayer() - .on("error", err => { - connection.destroy(); - console.error(err.message); - }); - - player.play(resource); - connection.subscribe(player); - - player.on(AudioPlayerStatus.Idle, () => { - connection.destroy(); - }); - } catch (error) { - console.error(error); - } - } -} - -module.exports = Clip; \ No newline at end of file diff --git a/TO REWRITE/Music/clips.js b/TO REWRITE/Music/clips.js deleted file mode 100644 index ab7cec01..00000000 --- a/TO REWRITE/Music/clips.js +++ /dev/null @@ -1,46 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fs = require("fs"); - -class Clips extends Command { - constructor(client) { - super(client, { - name: "clips", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - fs.readdir("./clips", function (err, files) { - if (err) return console.log("Unable to read directory: " + err); - - const clips = []; - - files.forEach(function (file) { - clips.push(file.substring(0, file.length - 4)); - }); - - const embed = new Discord.EmbedBuilder() - .setTitle(message.translate("music/clips:EMBED_TITLE")) - .setDescription(clips.join("\n")) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTimestamp(); - message.reply({ - embeds: [embed] - }); - }); - } -} - -module.exports = Clips; \ No newline at end of file diff --git a/TO REWRITE/Music/jump.js b/TO REWRITE/Music/jump.js deleted file mode 100644 index dbbb5a1a..00000000 --- a/TO REWRITE/Music/jump.js +++ /dev/null @@ -1,53 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Jump extends Command { - constructor(client) { - super(client, { - name: "jump", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["j"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const queue = this.client.player.getQueue(message); - const voice = message.member.voice.channel; - const number = parseInt(args[0]); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (number < 0) return message.error("music/jump:NO_PREV_SONG", { prefix: data.guild.prefix }); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("music/jump:SUCCESS") - }) - .setThumbnail(queue.songs[number].thumbnail) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.jump(message, number); - embed.setDescription(message.translate("music/play:NOW_PLAYING", { - songName: queue.songs[number].name - })); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Jump; \ No newline at end of file diff --git a/TO REWRITE/Music/loop.js b/TO REWRITE/Music/loop.js deleted file mode 100644 index 05a19d7a..00000000 --- a/TO REWRITE/Music/loop.js +++ /dev/null @@ -1,40 +0,0 @@ -const Command = require("../../base/Command"); - -class Loop extends Command { - constructor(client) { - super(client, { - name: "loop", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["repeat", "l"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const type = args[0]; - let mode = null; - if (type === "queue" || type === "all") { - mode = this.client.player.setRepeatMode(message, 2); - } else if (type === "song" || type === "single") { - mode = this.client.player.setRepeatMode(message, 1); - } else { - mode = this.client.player.setRepeatMode(message, 0); - } - - message.success(`music/loop:${mode ? mode === 2 ? "QUEUE" : "SONG" : "DISABLED"}`); - } -} - -module.exports = Loop; \ No newline at end of file diff --git a/TO REWRITE/Music/np.js b/TO REWRITE/Music/np.js deleted file mode 100644 index eab34af0..00000000 --- a/TO REWRITE/Music/np.js +++ /dev/null @@ -1,77 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Nowplaying extends Command { - constructor(client) { - super(client, { - name: "nowplaying", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const track = queue.songs[0]; - - const status = queue => - `${message.translate("music/np:FILTERS")}: \`${ - queue.filters.join(", ") || message.translate("music/np:DISABLED") - }\` | ${message.translate("music/np:REPEAT")}: \`${ - queue.repeatMode - ? queue.repeatMode === 2 ? message.translate("music/np:QUEUE") : message.translate("music/np:SONG") - : message.translate("music/np:DISABLED") - }\` | ${message.translate("music/np:AUTOPLAY")}: \`${ - queue.autoplay - ? message.translate("music/np:ENABLED") - : message.translate("music/np:DISABLED") - }\``; - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("music/queue:TITLE") - }) - .setThumbnail(track.thumbnail) - .addFields([ - { - name: message.translate("music/np:T_TITLE"), - value: `[${track.name}](${track.url})` - }, - { - name: message.translate("music/np:T_CHANNEL"), - value: track.uploader.name || message.translate("common:UNKNOWN") - }, - { - name: message.translate("music/np:T_DURATION"), - value: `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : message.translate("music/play:LIVE")}` - }, - { - name: message.translate("music/np:T_CONF"), - value: status(queue) - } - ]) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTimestamp(); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Nowplaying; \ No newline at end of file diff --git a/TO REWRITE/Music/pause.js b/TO REWRITE/Music/pause.js deleted file mode 100644 index efa90801..00000000 --- a/TO REWRITE/Music/pause.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require("../../base/Command"); - -class Pause extends Command { - constructor(client) { - super(client, { - name: "pause", - dirname: __dirname, - enabled: false, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music:play:NOT_PLAYING"); - - await this.client.player.pause(message); - - message.sendT("music/pause:SUCCESS"); - } -} - -module.exports = Pause; \ No newline at end of file diff --git a/TO REWRITE/Music/play.js b/TO REWRITE/Music/play.js deleted file mode 100644 index 6f0ddb00..00000000 --- a/TO REWRITE/Music/play.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - { PermissionsBitField } = require("discord.js"); - -class Play extends Command { - constructor(client) { - super(client, { - name: "play", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["p"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const name = args.join(" "); - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!name) return message.error("music/play:MISSING_SONG_NAME"); - - // Check my permissions - const perms = voice.permissionsFor(this.client.user); - if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return message.error("music/play:VOICE_CHANNEL_CONNECT"); - - try { - this.client.player.play(message.member.voice.channel, args.join(" "), { - member: message.member, - textChannel: message.channel, - message - }); - } catch (e) { - message.error("music/play:ERR_OCCURRED", { - error: e - }); - console.error(e); - } - } -} - -module.exports = Play; \ No newline at end of file diff --git a/TO REWRITE/Music/queue.js b/TO REWRITE/Music/queue.js deleted file mode 100644 index 5aac7b8a..00000000 --- a/TO REWRITE/Music/queue.js +++ /dev/null @@ -1,72 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - Pagination = require("customizable-discordjs-pagination"); - -class Queue extends Command { - constructor(client) { - super(client, { - name: "queue", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["q"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - if (queue.songs.length === 1) { - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("music/queue:TITLE"), - iconURL: message.guild.iconURL() - }) - .addFields([ - { - name: message.translate("music/np:CURRENTLY_PLAYING"), - value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` - } - ]) - .setColor(data.config.embed.color); - return message.reply({ - embeds: [embed] - }); - } - - const FieldsEmbed = new Pagination.FieldsEmbed(); - - FieldsEmbed.embed - .setColor(data.config.embed.color) - .setAuthor({ - name: message.translate("music/queue:TITLE"), - iconURL: message.guild.iconURL() - }) - .addFields([ - { - name: message.translate("music/np:CURRENTLY_PLAYING"), - value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${message.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` - } - ]); - FieldsEmbed - .setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : []) - .setAuthorizedUsers([message.author.id]) - .setChannel(message.channel) - .setElementsPerPage(5) - .setDeleteOnTimeout(true) - .setPageIndicator(true) - .formatField(message.translate("music/queue:TITLE"), (track) => `**${queue.songs.indexOf(track)}**. [${track.name}](${track.url})\n*${message.translate("music/queue:ADDED")} ${track.member}*\n`) - .build(); - } -} - -module.exports = Queue; \ No newline at end of file diff --git a/TO REWRITE/Music/resume.js b/TO REWRITE/Music/resume.js deleted file mode 100644 index b056d6eb..00000000 --- a/TO REWRITE/Music/resume.js +++ /dev/null @@ -1,32 +0,0 @@ -const Command = require("../../base/Command"); - -class Resume extends Command { - constructor(client) { - super(client, { - name: "resume", - dirname: __dirname, - enabled: false, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music:play:NOT_PLAYING"); - - await this.client.player.resume(message); - - message.sendT("music/resume:SUCCESS"); - } -} - -module.exports = Resume; \ No newline at end of file diff --git a/TO REWRITE/Music/seek.js b/TO REWRITE/Music/seek.js deleted file mode 100644 index 5501b67f..00000000 --- a/TO REWRITE/Music/seek.js +++ /dev/null @@ -1,35 +0,0 @@ -const Command = require("../../base/Command"); -const ms = require("ms"); - -class Seek extends Command { - constructor(client) { - super(client, { - name: "seek", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - const time = ms(args[0]) / 1000; - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (isNaN(time)) return message.error("music/seek:INVALID_TIME"); - - await this.client.player.seek(message, time); - - message.sendT("music/seek:SUCCESS"); - } -} - -module.exports = Seek; \ No newline at end of file diff --git a/TO REWRITE/Music/skip.js b/TO REWRITE/Music/skip.js deleted file mode 100644 index 4afd4b1e..00000000 --- a/TO REWRITE/Music/skip.js +++ /dev/null @@ -1,52 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Skip extends Command { - constructor(client) { - super(client, { - name: "skip", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["s"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - if (!queue.songs[1]) return message.error("music/skip:NO_NEXT_SONG"); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("music/skip:SUCCESS") - }) - .setThumbnail(queue.songs[1].thumbnail) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.skip(message); - embed.setDescription(message.translate("music/play:NOW_PLAYING", { - songName: queue.songs[1].name - })); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Skip; \ No newline at end of file diff --git a/TO REWRITE/Music/stop.js b/TO REWRITE/Music/stop.js deleted file mode 100644 index d312d8cf..00000000 --- a/TO REWRITE/Music/stop.js +++ /dev/null @@ -1,48 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Stop extends Command { - constructor(client) { - super(client, { - name: "stop", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["leave", "st"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args, data) { - const voice = message.member.voice.channel; - const queue = await this.client.player.getQueue(message); - - if (!voice) return message.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return message.error("music/play:NOT_PLAYING"); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: message.translate("music/stop:DESCRIPTION") - }) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color); - - const m = await message.reply({ - embeds: [embed] - }); - - this.client.player.stop(message); - embed.setDescription(message.translate("music/stop:SUCCESS")); - m.edit({ - embeds: [embed] - }); - } -} - -module.exports = Stop; \ No newline at end of file diff --git a/TO REWRITE/queue.js b/TO REWRITE/queue.js new file mode 100644 index 00000000..de3abea3 --- /dev/null +++ b/TO REWRITE/queue.js @@ -0,0 +1,115 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + { sendPaginatedEmbeds } = require("discord.js-embed-pagination"); + +class Queue extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("queue") + .setDescription(client.translate("music/queue:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + + if (queue.songs.length === 1) { + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/queue:TITLE"), + iconURL: interaction.guild.iconURL() + }) + .addFields([ + { + name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), + value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` + } + ]) + .setColor(client.config.embed.color); + return interaction.reply({ + embeds: [embed] + }); + } + + const songs = queue.songs.slice(1, queue.songs.length).map(song => { + return { + name: interaction.translate("music/queue:TITLE"), + value: `**${queue.songs.indexOf(song)}**. [${song.name}](${song.url})\n*${interaction.translate("music/queue:ADDED")} ${song.member}*\n` + }; + }); + + const pages = songs.map(song => { + new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/queue:TITLE"), + iconURL: interaction.guild.iconURL() + }) + .setColor(client.config.embed.color) + .addFields([ + // { + // name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), + // value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` + // }, + ...songs + ]); + }); + + sendPaginatedEmbeds(interaction, pages, { + previousLabel: interaction.translate("music/queue:"), + nextLabel: interaction.translate("music/queue:"), + pageLabel: interaction.translate("music/queue:"), + content: `${interaction.translate("music/nowplaying:CURRENTLY_PLAYING")}\n[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`, + showPagePosition: true, + time: 120000 + }); + + // FieldsEmbed.embed + // .setColor(client.config.embed.color) + // .setAuthor({ + // name: interaction.translate("music/queue:TITLE"), + // iconURL: interaction.guild.iconURL() + // }) + // .addFields([ + // { + // name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), + // value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` + // } + // ]); + // FieldsEmbed + // .setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : []) + // .setAuthorizedUsers([interaction.member.id]) + // .setChannel(interaction.channel) + // .setElementsPerPage(5) + // .setDeleteOnTimeout(true) + // .setPageIndicator(true) + // .formatField(interaction.translate("music/queue:TITLE"), (track) => `**${queue.songs.indexOf(track)}**. [${track.name}](${track.url})\n*${interaction.translate("music/queue:ADDED")} ${track.member}*\n`) + // .build(); + } +} + +module.exports = Queue; \ No newline at end of file diff --git a/base/Guild.js b/base/Guild.js index b335be5d..a196cd26 100644 --- a/base/Guild.js +++ b/base/Guild.js @@ -42,11 +42,6 @@ module.exports = mongoose.model("Guild", new Schema({ kick: false, // The number of warns required to kick the user ban: false // The number of warns required to ban the user }, - // Tickets - tickets: { - enabled: false, // Whether the tickets system is enabled - category: null // The category for the tickets system - }, suggestions: false, // the channel in which the suggestions will be sent modlogs: false, // the channel in which the moderation logs (mute, kick, ban, etc...) will be sent birthdays: false, // the channel in which birtdays announcements will be sent diff --git a/base/JaBa.js b/base/JaBa.js index c0d5e62e..7fac3148 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -90,7 +90,7 @@ class JaBa extends Client { .on("searchResult", (message, result) => { let i = 0; const embed = new EmbedBuilder() - .setDescription(result.map(song => `**${++i} -** ${song.name}`).join("\n")) + .setDescription(result.map(song => `**${++i}** - ${song.name}`).join("\n")) .setFooter({ text: this.translate("music/play:RESULTS_FOOTER", null, message.guild.data.language) }) .setColor(this.config.embed.color); message.reply({ embeds: [embed] }); diff --git a/commands/Fun/lovecalc.js b/commands/Fun/lovecalc.js index 8de8e276..b01566f7 100644 --- a/commands/Fun/lovecalc.js +++ b/commands/Fun/lovecalc.js @@ -40,7 +40,7 @@ class Lovecalc extends BaseCommand { */ async execute(client, interaction) { const firstMember = interaction.options.getMember("first_member"); - const secondMember = interaction.options.getMember("second_member") || interaction.user; + const secondMember = interaction.options.getMember("second_member") || interaction.member; const members = [firstMember, secondMember].sort((a, b) => parseInt(a.id, 10) - parseInt(b.id, 10)); const hash = md5(`${members[0].id}${members[1].user.username}${members[0].user.username}${members[1].id}`); diff --git a/commands/Fun/memes.js b/commands/Fun/memes.js index a681313e..621ff3d6 100644 --- a/commands/Fun/memes.js +++ b/commands/Fun/memes.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector } = require("discord.js"); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"), fetch = require("node-fetch"); @@ -54,6 +54,7 @@ class Memes extends BaseCommand { }); const collector = new InteractionCollector(client, { + componentType: ComponentType.SelectMenu, message: msg, idle: 60 * 1000 }); @@ -71,7 +72,7 @@ class Memes extends BaseCommand { .setImage(res.url) .setTimestamp(); - msg.update({ + await msg.update({ embeds: [embed] }); }); diff --git a/commands/General/activity.js b/commands/General/activity.js index 0570fd6e..4576f9df 100644 --- a/commands/General/activity.js +++ b/commands/General/activity.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField } = require("discord.js"), +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField, ComponentType } = require("discord.js"), { defaultApplications } = require("../../helpers/discordTogether"); const BaseCommand = require("../../base/BaseCommand"); @@ -60,6 +60,7 @@ class Activity extends BaseCommand { }); const collector = new InteractionCollector(client, { + componentType: ComponentType.SelectMenu, message: msg, idle: 60 * 1000 }); @@ -77,7 +78,7 @@ class Activity extends BaseCommand { }) .setTimestamp(); - msg.update({ + await msg.update({ embeds: [embed], components: [] }); diff --git a/commands/General/help.js b/commands/General/help.js index ec4e17be..65797bb6 100644 --- a/commands/General/help.js +++ b/commands/General/help.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField } = require("discord.js"); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, PermissionsBitField, ComponentType } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Help extends BaseCommand { @@ -48,7 +48,7 @@ class Help extends BaseCommand { commands.forEach(c => { if (!categories.includes(c.category)) { - if (c.category === "Owner" && interaction.user.id !== client.config.owner.id) return; + if (c.category === "Owner" && interaction.member.id !== client.config.owner.id) return; categories.push(c.category); } }); @@ -75,6 +75,7 @@ class Help extends BaseCommand { }); const collector = new InteractionCollector(client, { + componentType: ComponentType.SelectMenu, message: msg, idle: 60 * 1000 }); @@ -107,7 +108,7 @@ class Help extends BaseCommand { }); } else { const embed = generateCommandHelp(client, interaction, arg); - return msg.update({ + await msg.update({ content: null, components: [], embeds: [embed] diff --git a/commands/Moderation/warn.js b/commands/Moderation/warn.js index da742882..e07d7cb9 100644 --- a/commands/Moderation/warn.js +++ b/commands/Moderation/warn.js @@ -35,8 +35,8 @@ class Warn extends BaseCommand { const memberPosition = member.roles.highest.position; const moderationPosition = interaction.member.roles.highest.position; if (member.user.bot) return; - if (member.id === interaction.user.id) return interaction.error("moderation/warn:YOURSELF"); - if (interaction.guild.ownerId !== interaction.user.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/ban:SUPERIOR"); + if (member.id === interaction.member.id) return interaction.error("moderation/warn:YOURSELF"); + if (interaction.guild.ownerId !== interaction.member.id && !(moderationPosition > memberPosition)) return interaction.error("moderation/ban:SUPERIOR"); const memberData = await client.findOrCreateMember({ id: member.id, @@ -60,7 +60,7 @@ class Warn extends BaseCommand { const submitted = await interaction.awaitModalSubmit({ time: 120000, - filter: i => i.user.id === interaction.user.id, + filter: i => i.user.id === interaction.member.id, }); if (submitted) { @@ -74,7 +74,7 @@ class Warn extends BaseCommand { data.guildData.save(); const caseInfo = { - moderator: interaction.user.id, + moderator: interaction.member.id, date: Date.now(), type: "warn", case: data.guildData.casesCount, diff --git a/commands/Moderation/warns.js b/commands/Moderation/warns.js index 0ad05d77..d6981180 100644 --- a/commands/Moderation/warns.js +++ b/commands/Moderation/warns.js @@ -45,8 +45,8 @@ class Warns extends BaseCommand { member: member.nickname || member.user.username }), iconURL: member.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .setColor(client.config.embed.color) diff --git a/commands/Music/autoplay.js b/commands/Music/autoplay.js new file mode 100644 index 00000000..43bbc9eb --- /dev/null +++ b/commands/Music/autoplay.js @@ -0,0 +1,46 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class AutoPlay extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("autoplay") + .setDescription(client.translate("music/autoplay:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { ephemeral: true }); + if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { ephemeral: true }); + + const autoplay = queue.toggleAutoplay(); + + interaction.success(`music/autoplay:SUCCESS_${autoplay ? "ENABLED" : "DISABLED"}`); + } +} + +module.exports = AutoPlay; \ No newline at end of file diff --git a/commands/Music/back.js b/commands/Music/back.js new file mode 100644 index 00000000..dd038e70 --- /dev/null +++ b/commands/Music/back.js @@ -0,0 +1,59 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Back extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("back") + .setDescription(client.translate("music/back:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { ephemeral: true }); + if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { ephemeral: true }); + if (!queue.previousSongs[0]) return interaction.error("music/back:NO_PREV_SONG", null, { ephemeral: true }); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/back:DESCRIPTION") + }) + .setThumbnail(queue.tracks[0].thumbnail) + .setDescription(interaction.translate("music/back:SUCCESS")) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + client.player.previous(interaction); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Back; \ No newline at end of file diff --git a/commands/Music/clips.js b/commands/Music/clips.js new file mode 100644 index 00000000..0f38a54c --- /dev/null +++ b/commands/Music/clips.js @@ -0,0 +1,114 @@ +const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"), + { joinVoiceChannel, createAudioResource, createAudioPlayer, getVoiceConnection, AudioPlayerStatus } = require("@discordjs/voice"); +const BaseCommand = require("../../base/BaseCommand"), + fs = require("fs"); + +class Clips extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("clips") + .setDescription(client.translate("music/clips:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + fs.readdir("./clips", async function (err, files) { + if (err) return console.log("Unable to read directory: " + err); + + const clips = files.map(file => { + const fileName = file.substring(0, file.length - 4); + return { + label: fileName, + value: fileName + }; + }); + + const row = new ActionRowBuilder() + .addComponents( + new SelectMenuBuilder() + .setCustomId("clips_select") + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) + .addOptions(clips) + ); + + const msg = await interaction.reply({ + content: interaction.translate("music/clips:AVAILABLE_CLIPS"), + ephemeral: true, + components: [row], + fetchReply: true + }); + + const collector = new InteractionCollector(client, { + componentType: ComponentType.SelectMenu, + message: msg, + idle: 60 * 1000 + }); + + collector.on("collect", async msg => { + const clip = msg?.values[0]; + const voice = msg.member.voice.channel; + const queue = client.player.getQueue(msg); + + if (!voice) return msg.error("music/play:NO_VOICE_CHANNEL"); + if (getVoiceConnection(msg.guild.id)) return msg.error("music/clip:ACTIVE_CLIP"); + if (queue) return msg.error("music/clip:ACTIVE_QUEUE"); + if (!clip) return msg.error("music/clip:NO_ARG"); + if (!fs.existsSync(`./clips/${clip}.mp3`)) return msg.error("music/clip:NO_FILE", { file: clip }); + + try { + const connection = joinVoiceChannel({ + channelId: voice.id, + guildId: msg.guild.id, + adapterCreator: msg.guild.voiceAdapterCreator + }); + + const resource = createAudioResource(fs.createReadStream(`./clips/${clip}.mp3`)); + const player = createAudioPlayer() + .on("error", err => { + connection.destroy(); + console.error(err.message); + }); + + player.play(resource); + connection.subscribe(player); + + player.on(AudioPlayerStatus.Idle, () => { + connection.destroy(); + }); + } catch (error) { + console.error(error); + } + + await msg.update({ + content: interaction.translate("music/clips:PLAYING", { + clip + }), + components: [] + }); + }); + }); + } +} + +module.exports = Clips; \ No newline at end of file diff --git a/commands/Music/jump.js b/commands/Music/jump.js new file mode 100644 index 00000000..4e81dcd1 --- /dev/null +++ b/commands/Music/jump.js @@ -0,0 +1,65 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Jump extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("jump") + .setDescription(client.translate("music/jump:DESCRIPTION")) + .addIntegerOption(option => option.setName("position") + .setDescription("music/jump:POSITION") + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const queue = client.player.getQueue(interaction); + const voice = interaction.member.voice.channel; + const position = interaction.options.getInteger("position"); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + if (position < 0) return interaction.error("music/jump:NO_PREV_SONG"); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/jump:SUCCESS") + }) + .setThumbnail(queue.songs[position].thumbnail) + .setDescription(interaction.translate("music/play:NOW_PLAYING", { + songName: queue.songs[position].name + })) + .setFooter({ + text: client.config.embed.footer + }) + .setColor(client.config.embed.color); + client.player.jump(interaction, position); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Jump; \ No newline at end of file diff --git a/commands/Music/loop.js b/commands/Music/loop.js new file mode 100644 index 00000000..75826b28 --- /dev/null +++ b/commands/Music/loop.js @@ -0,0 +1,90 @@ +const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Loop extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("loop") + .setDescription(client.translate("music/loop:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + + const row = new ActionRowBuilder() + .addComponents( + new SelectMenuBuilder() + .setCustomId("nsfw_select") + .setPlaceholder(client.translate("common:NOTHING_SELECTED")) + .addOptions([ + { + label: client.translate("music/loop:QUEUE"), + value: "queue" + }, + { + label: client.translate("music/loop:SONG"), + value: "song" + } + ]) + ); + + const msg = await interaction.reply({ + content: interaction.translate("common:AVAILABLE_CATEGORIES"), + ephemeral: true, + components: [row], + fetchReply: true + }); + + const collector = new InteractionCollector(client, { + componentType: ComponentType.SelectMenu, + message: msg, + idle: 60 * 1000 + }); + + collector.on("collect", async msg => { + const type = msg?.values[0]; + let mode = null; + + if (type === "queue") { + mode = client.player.setRepeatMode(interaction, 2); + } else if (type === "song") { + mode = client.player.setRepeatMode(interaction, 1); + } else { + mode = client.player.setRepeatMode(interaction, 0); + } + + await msg.update({ + content: `music/loop:${mode ? mode === 2 ? "QUEUE_ENABLED" : "SONG_ENABLED" : "DISABLED"}`, + components: [] + }); + }); + } +} + +module.exports = Loop; \ No newline at end of file diff --git a/commands/Music/nowplaying.js b/commands/Music/nowplaying.js new file mode 100644 index 00000000..c9445a2a --- /dev/null +++ b/commands/Music/nowplaying.js @@ -0,0 +1,88 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Nowplaying extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("nowplaying") + .setDescription(client.translate("music/nowplaying:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + + const track = queue.songs[0]; + + const status = queue => + `${interaction.translate("music/nowplaying:REPEAT")}: \`${ + queue.repeatMode + ? queue.repeatMode === 2 ? interaction.translate("music/nowplaying:QUEUE") : interaction.translate("music/nowplaying:SONG") + : interaction.translate("music/nowplaying:DISABLED") + }\` | ${interaction.translate("music/nowplaying:AUTOPLAY")}: \`${ + queue.autoplay + ? interaction.translate("music/nowplaying:ENABLED") + : interaction.translate("music/nowplaying:DISABLED") + }\``; + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/queue:TITLE") + }) + .setThumbnail(track.thumbnail) + .addFields([ + { + name: interaction.translate("music/nowplaying:T_TITLE"), + value: `[${track.name}](${track.url})` + }, + { + name: interaction.translate("music/nowplaying:T_CHANNEL"), + value: track.uploader.name || interaction.translate("common:UNKNOWN") + }, + { + name: interaction.translate("music/nowplaying:T_DURATION"), + value: `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : interaction.translate("music/play:LIVE")}` + }, + { + name: interaction.translate("music/nowplaying:T_CONF"), + value: status(queue) + } + ]) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }) + .setTimestamp(); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Nowplaying; \ No newline at end of file diff --git a/commands/Music/play.js b/commands/Music/play.js new file mode 100644 index 00000000..c2a7ef08 --- /dev/null +++ b/commands/Music/play.js @@ -0,0 +1,64 @@ +const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Play extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("play") + .setDescription(client.translate("music/play:DESCRIPTION")) + .addStringOption(option => option.setName("link") + .setDescription(client.translate("music/play:LINK")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + await interaction.deferReply(); + + const voice = interaction.member.voice.channel; + const link = interaction.options.getString("link"); + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + + const perms = voice.permissionsFor(client.user); + if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT"); + + try { + client.player.play(interaction.member.voice.channel, link, { + member: interaction.member, + textChannel: interaction.channel + }); + + interaction.editReply({ + content: interaction.translate("music/play:ADDED_QUEUE", { songName: link }) + }); + } catch (e) { + interaction.error("music/play:ERR_OCCURRED", { + error: e + }); + console.error(e); + } + } +} + +module.exports = Play; \ No newline at end of file diff --git a/commands/Music/seek.js b/commands/Music/seek.js new file mode 100644 index 00000000..b85eaf6e --- /dev/null +++ b/commands/Music/seek.js @@ -0,0 +1,54 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + ms = require("ms"); + +class Seek extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("seek") + .setDescription(client.translate("music/seek:DESCRIPTION")) + .addStringOption(option => option.setName("time") + .setDescription("music/seek:TIME") + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + const time = ms(interaction.options.getString("time")) / 1000; + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + if (isNaN(time)) return interaction.error("music/seek:INVALID_TIME"); + + await client.player.seek(interaction, time); + + interaction.replyT("music/seek:SUCCESS", { + time: ms(interaction.options.getString("time")) + }); + } +} + +module.exports = Seek; \ No newline at end of file diff --git a/commands/Music/skip.js b/commands/Music/skip.js new file mode 100644 index 00000000..883238bb --- /dev/null +++ b/commands/Music/skip.js @@ -0,0 +1,61 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Skip extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("skip") + .setDescription(client.translate("music/skip:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + if (!queue.songs[1]) return interaction.error("music/skip:NO_NEXT_SONG"); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/skip:SUCCESS") + }) + .setThumbnail(queue.songs[1].thumbnail) + .setDescription(interaction.translate("music/play:NOW_PLAYING", { + songName: queue.songs[1].name + })) + .setFooter({ + text: client.config.embed.footer + }) + .setColor(client.config.embed.color); + client.player.skip(interaction); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Skip; \ No newline at end of file diff --git a/commands/Music/stop.js b/commands/Music/stop.js new file mode 100644 index 00000000..08f2d31f --- /dev/null +++ b/commands/Music/stop.js @@ -0,0 +1,57 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Stop extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("stop") + .setDescription(client.translate("music/stop:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction); + + if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/stop:DESCRIPTION") + }) + .setDescription(interaction.translate("music/stop:SUCCESS")) + .setFooter({ + text: client.config.embed.footer + }) + .setColor(client.config.embed.color); + client.player.stop(interaction); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Stop; \ No newline at end of file diff --git a/commands/NSFW/nsfw.js b/commands/NSFW/nsfw.js index 5a0c0197..b1ecddf7 100644 --- a/commands/NSFW/nsfw.js +++ b/commands/NSFW/nsfw.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector } = require("discord.js"); +const { SlashCommandBuilder, EmbedBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"), fetch = require("node-fetch"); @@ -57,6 +57,7 @@ class NSFW extends BaseCommand { }); const collector = new InteractionCollector(client, { + componentType: ComponentType.SelectMenu, message: msg, idle: 60 * 1000 }); @@ -74,7 +75,7 @@ class NSFW extends BaseCommand { .setImage(res.url) .setTimestamp(); - msg.update({ + await msg.update({ embeds: [embed] }); }); diff --git a/commands/Owner/announcement.js b/commands/Owner/announcement.js new file mode 100644 index 00000000..31d46e45 --- /dev/null +++ b/commands/Owner/announcement.js @@ -0,0 +1,69 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Announcement extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("announcement") + .setDescription(client.translate("owner/announcement:DESCRIPTION")) + .addStringOption(option => + option.setName("message") + .setDescription(client.translate("owner/say:MESSAGE")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: true + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + await interaction.deferReply({ ephemeral: true }); + const text = interaction.options.getString("message"); + if (text.length > 1000) return interaction.error("owner/announcement:TOO_LONG"); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("owner/announcement:TITLE") + }) + .setDescription(text) + .setColor(client.config.embed.color) + .setFooter({ + text: interaction.user.tag + }) + .setTimestamp(); + + client.guilds.cache.forEach(async guild => { + if (guild.id === "568120814776614924") return; + const channel = guild.channels.cache.find(g => g.id === guild?.data.plugins.welcome.channel); + await channel.send({ + content: "||@everyone|| ВАЖНОЕ ОБЪЯВЛЕНИЕ!", + embeds: [embed] + }); + }); + + interaction.editReply({ + content: interaction.translate("owner/announcement:SENDED"), + ephemeral: true + }); + } +} + +module.exports = Announcement; \ No newline at end of file diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js index 30e83b0f..fe76982e 100644 --- a/commands/Owner/eval.js +++ b/commands/Owner/eval.js @@ -1,4 +1,3 @@ -/* eslint-disable no-unused-vars */ const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); @@ -26,7 +25,7 @@ class Eval extends BaseCommand { * * @param {import("../../base/JaBa")} client */ - async onLoad(client) { + async onLoad() { //... } /** @@ -35,6 +34,7 @@ class Eval extends BaseCommand { * @param {import("discord.js").ChatInputCommandInteraction} interaction * @param {Array} data */ + // eslint-disable-next-line no-unused-vars async execute(client, interaction, data) { const code = interaction.options.getString("code"); const result = new Promise((resolve) => resolve(eval(code))); diff --git a/commands/Owner/servers.js b/commands/Owner/servers.js index 4e90f222..cc2d34dc 100644 --- a/commands/Owner/servers.js +++ b/commands/Owner/servers.js @@ -46,9 +46,9 @@ class Servers extends BaseCommand { const embed = new EmbedBuilder() .setAuthor({ name: interaction.user.tag, - iconURL: interaction.user.displayAvatarURL({ - size: 512, - format: "png" + iconURL: interaction.member.displayAvatarURL({ + extension: "png", + size: 512 }) }) .setColor(client.config.embed.color) @@ -124,7 +124,7 @@ class Servers extends BaseCommand { if (reaction._emoji.name === "❌") return msg.delete(); - await reaction.users.remove(interaction.user.id); + await reaction.users.remove(interaction.member.id); }); } } diff --git a/events/CommandHandler.js b/events/CommandHandler.js index 21daf30c..e60466f6 100644 --- a/events/CommandHandler.js +++ b/events/CommandHandler.js @@ -26,7 +26,7 @@ class CommandHandler extends BaseEvent { data.userData = userData; if (command.guildOnly && !interaction.inGuild()) return interaction.replyT("misc:GUILD_ONLY", { ephemeral: true }); - if (command.ownerOnly && interaction.user.id !== client.config.owner.id) return interaction.replyT("misc:OWNER_ONLY", { ephemeral: true }); + if (command.ownerOnly && interaction.member.id !== client.config.owner.id) return interaction.replyT("misc:OWNER_ONLY", { ephemeral: true }); if (interaction.inGuild()) { const guildData = await client.findOrCreateGuild({ diff --git a/events/Guild/guildCreate.js b/events/Guild/guildCreate.js index d112575a..d746d2e9 100644 --- a/events/Guild/guildCreate.js +++ b/events/Guild/guildCreate.js @@ -11,12 +11,13 @@ class GuildCreate extends BaseEvent { /** * + * @param {import("../../base/JaBa")} client * @param {import("discord.js").Guild} guild */ - async execute(guild) { + async execute(client, guild) { const messageOptions = {}; - const userData = await this.client.findOrCreateUser({ + const userData = await client.findOrCreateUser({ id: guild.ownerId }); @@ -36,9 +37,9 @@ class GuildCreate extends BaseEvent { name: "Спасибо что добавили меня на свой сервер!" }) .setDescription("Чтобы получить список команд использууйуте `/help` и посмотрите на административные команды!.") - .setColor(this.client.config.embed.color) + .setColor(client.config.embed.color) .setFooter({ - text: this.client.config.embed.footer + text: client.config.embed.footer }) .setTimestamp(); messageOptions.embed = thanksEmbed; @@ -55,8 +56,8 @@ class GuildCreate extends BaseEvent { iconURL: guild.iconURL() }) .setColor("#32CD32") - .setDescription(`Зашёл на сервер **${guild.name}**. На нём **${users}** ${this.client.getNoun(users, this.client.translate("misc:NOUNS:USERS:1"), this.client.translate("misc:NOUNS:USERS:2"), this.client.translate("misc:NOUNS:USERS:5"))} (из них **${bots}** ${this.client.getNoun(bots, this.client.translate("misc:NOUNS:BOTS:1"), this.client.translate("misc:NOUNS:BOTS:2"), this.client.translate("misc:NOUNS:BOTS:5"))})`); - this.client.channels.cache.get(this.client.config.support.logs).send({ + .setDescription(`Зашёл на сервер **${guild.name}**. На нём **${users}** ${client.getNoun(users, client.translate("misc:NOUNS:USERS:1"), client.translate("misc:NOUNS:USERS:2"), client.translate("misc:NOUNS:USERS:5"))} и **${bots}** ${client.getNoun(bots, client.translate("misc:NOUNS:BOTS:1"), client.translate("misc:NOUNS:BOTS:2"), client.translate("misc:NOUNS:BOTS:5"))}`); + client.channels.cache.get(client.config.support.logs).send({ embeds: [embed] }); } diff --git a/events/Guild/guildDelete.js b/events/Guild/guildDelete.js index 13ff80bd..56a438b4 100644 --- a/events/Guild/guildDelete.js +++ b/events/Guild/guildDelete.js @@ -8,11 +8,13 @@ class GuildDelete extends BaseEvent { once: false }); } + /** * + * @param {import("../../base/JaBa")} client * @param {import("discord.js").Guild} guild */ - async execute(guild) { + async execute(client, guild) { const embed = new EmbedBuilder() .setAuthor({ name: guild.name, @@ -20,7 +22,7 @@ class GuildDelete extends BaseEvent { }) .setColor("#B22222") .setDescription(`Вышел с сервера **${guild.name}**.`); - this.client.channels.cache.get(this.client.config.support.logs).send({ + client.channels.cache.get(client.config.support.logs).send({ embeds: [embed] }); } diff --git a/events/Guild/guildMemberAdd.js b/events/Guild/guildMemberAdd.js index d257cd3e..714037c2 100644 --- a/events/Guild/guildMemberAdd.js +++ b/events/Guild/guildMemberAdd.js @@ -26,19 +26,20 @@ class GuildMemberAdd extends BaseEvent { /** * + * @param {import("../../base/JaBa")} client * @param {import("discord.js").GuildMember} member */ - async execute(member) { + async execute(client, member) { if (member.guild && member.guild.id === "568120814776614924") return; await member.guild.members.fetch(); - const guildData = await this.client.findOrCreateGuild({ + const guildData = await client.findOrCreateGuild({ id: member.guild.id }); member.guild.data = guildData; - const memberData = await this.client.findOrCreateMember({ + const memberData = await client.findOrCreateMember({ id: member.id, guildID: member.guild.id }); @@ -63,7 +64,7 @@ class GuildMemberAdd extends BaseEvent { .replace(/{user}/g, member) .replace(/{server}/g, member.guild.name) .replace(/{membercount}/g, member.guild.memberCount) - .replace(/{createdat}/g, this.client.printDate(member.user.createdAt)); + .replace(/{createdat}/g, client.printDate(member.user.createdAt)); if (guildData.plugins.welcome.withImage) { const canvas = Canvas.createCanvas(1024, 450), ctx = canvas.getContext("2d"); @@ -96,13 +97,13 @@ class GuildMemberAdd extends BaseEvent { ctx.fillText(member.user.username, canvas.width - 670, canvas.height - 250); // Draw server name - ctx.font = applyText(canvas, member.guild.translate("administration/welcome:IMG_WELCOME", { + ctx.font = applyText(canvas, client.translate("administration/welcome:IMG_WELCOME", { server: member.guild.name - }), 53, 625, "RubikMonoOne"); + }, member.guild.data.language), 53, 625, "RubikMonoOne"); - ctx.fillText(member.guild.translate("administration/welcome:IMG_WELCOME", { + ctx.fillText(client.translate("administration/welcome:IMG_WELCOME", { server: member.guild.name - }), canvas.width - 700, canvas.height - 70); + }, member.guild.data.language), canvas.width - 700, canvas.height - 70); // Draw discriminator ctx.font = "35px RubikMonoOne"; @@ -110,7 +111,7 @@ class GuildMemberAdd extends BaseEvent { // Draw membercount ctx.font = "22px RubikMonoOne"; - ctx.fillText(`${member.guild.memberCount}й ${member.guild.translate("misc:NOUNS:MEMBERS:1")}`, 40, canvas.height - 35); + ctx.fillText(`${member.guild.memberCount}й ${client.translate("misc:NOUNS:MEMBERS:1", null, member.guild.data.language)}`, 40, canvas.height - 35); // Draw # for discriminator ctx.fillStyle = "#FFFFFF"; @@ -121,9 +122,9 @@ class GuildMemberAdd extends BaseEvent { ctx.font = "45px RubikMonoOne"; ctx.strokeStyle = "#000000"; ctx.lineWidth = 10; - ctx.strokeText(member.guild.translate("administration/welcome:TITLE"), canvas.width - 670, canvas.height - 330); + ctx.strokeText(client.translate("administration/welcome:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); ctx.fillStyle = "#FFFFFF"; - ctx.fillText(member.guild.translate("administration/welcome:TITLE"), canvas.width - 670, canvas.height - 330); + ctx.fillText(client.translate("administration/welcome:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); // Draw avatar circle ctx.beginPath(); @@ -133,8 +134,8 @@ class GuildMemberAdd extends BaseEvent { ctx.stroke(); ctx.closePath(); ctx.clip(); - const avatar = await Canvas.loadImage(member.user.displayAvatarURL({ - format: "png", + const avatar = await Canvas.loadImage(member.displayAvatarURL({ + extension: "jpg", size: 512 })); ctx.drawImage(avatar, 45, 90, 270, 270); diff --git a/events/Guild/guildMemberRemove.js b/events/Guild/guildMemberRemove.js index e0b3427b..3356be89 100644 --- a/events/Guild/guildMemberRemove.js +++ b/events/Guild/guildMemberRemove.js @@ -26,14 +26,15 @@ class GuildMemberRemove extends BaseEvent { /** * + * @param {import("../../base/JaBa")} client * @param {import("discord.js").GuildMember} member */ - async execute(member) { + async execute(client, member) { if (member.guild && member.guild.id === "568120814776614924") return; await member.guild.members.fetch(); - const guildData = await this.client.findOrCreateGuild({ + const guildData = await client.findOrCreateGuild({ id: member.guild.id }); member.guild.data = guildData; @@ -46,7 +47,7 @@ class GuildMemberRemove extends BaseEvent { .replace(/{user}/g, member.user.tag) .replace(/{server}/g, member.guild.name) .replace(/{membercount}/g, member.guild.memberCount) - .replace(/{createdat}/g, this.client.printDate(member.user.createdAt)); + .replace(/{createdat}/g, client.printDate(member.user.createdAt)); if (guildData.plugins.goodbye.withImage) { const canvas = Canvas.createCanvas(1024, 450), ctx = canvas.getContext("2d"); @@ -79,13 +80,13 @@ class GuildMemberRemove extends BaseEvent { ctx.fillText(member.user.username, canvas.width - 670, canvas.height - 250); // Draw server name - ctx.font = applyText(canvas, member.guild.translate("administration/goodbye:IMG_GOODBYE", { + ctx.font = applyText(canvas, client.translate("administration/goodbye:IMG_GOODBYE", { server: member.guild.name - }), 53, 625, "RubikMonoOne"); + }, member.guild.data.language), 53, 625, "RubikMonoOne"); - ctx.fillText(member.guild.translate("administration/goodbye:IMG_GOODBYE", { + ctx.fillText(client.translate("administration/goodbye:IMG_GOODBYE", { server: member.guild.name - }), canvas.width - 700, canvas.height - 70); + }, member.guild.data.language), canvas.width - 700, canvas.height - 70); // Draw discriminator ctx.font = "35px RubikMonoOne"; @@ -93,7 +94,7 @@ class GuildMemberRemove extends BaseEvent { // Draw membercount ctx.font = "22px RubikMonoOne"; - ctx.fillText(`${member.guild.memberCount} ${this.client.getNoun(member.guild.memberCount, member.guild.translate("misc:NOUNS:MEMBERS:1"), member.guild.translate("misc:NOUNS:MEMBERS:2"), member.guild.translate("misc:NOUNS:MEMBERS:5"))}`, 40, canvas.height - 35); + ctx.fillText(`${member.guild.memberCount} ${client.getNoun(member.guild.memberCount, client.translate("misc:NOUNS:MEMBERS:1", null, member.guild.data.language), client.translate("misc:NOUNS:MEMBERS:2", null, member.guild.data.language), client.translate("misc:NOUNS:MEMBERS:5", null, member.guild.data.language))}`, 40, canvas.height - 35); // Draw # for discriminator ctx.fillStyle = "#FFFFFF"; @@ -104,9 +105,9 @@ class GuildMemberRemove extends BaseEvent { ctx.font = "45px RubikMonoOne"; ctx.strokeStyle = "#000000"; ctx.lineWidth = 10; - ctx.strokeText(member.guild.translate("administration/goodbye:TITLE"), canvas.width - 670, canvas.height - 330); + ctx.strokeText(client.translate("administration/goodbye:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); ctx.fillStyle = "#FFFFFF"; - ctx.fillText(member.guild.translate("administration/goodbye:TITLE"), canvas.width - 670, canvas.height - 330); + ctx.fillText(client.translate("administration/goodbye:TITLE", null, member.guild.data.language), canvas.width - 670, canvas.height - 330); // Draw avatar circle ctx.beginPath(); @@ -116,8 +117,8 @@ class GuildMemberRemove extends BaseEvent { ctx.stroke(); ctx.closePath(); ctx.clip(); - const avatar = await Canvas.loadImage(member.user.displayAvatarURL({ - format: "png", + const avatar = await Canvas.loadImage(member.displayAvatarURL({ + extension: "png", size: 512 })); ctx.drawImage(avatar, 45, 90, 270, 270); diff --git a/events/Guild/guildMemberUpdate.js b/events/Guild/guildMemberUpdate.js index 1ac6bd41..9f4bdf11 100644 --- a/events/Guild/guildMemberUpdate.js +++ b/events/Guild/guildMemberUpdate.js @@ -10,16 +10,17 @@ class GuildMemberUpdate extends BaseEvent { /** * + * @param {import("../../base/JaBa")} client * @param {import("discord.js").GuildMember} oldMember * @param {import("discord.js").GuildMember} newMember */ - async execute(oldMember, newMember) { + async execute(client, oldMember, newMember) { if (oldMember.guild && oldMember.guild.id === "568120814776614924") return; - - if (oldMember.guild.id !== this.client.config.support.id) return; + if (oldMember.guild.id !== client.config.support.id) return; if (oldMember.roles.cache.some((r) => r.name === "Поддержавшие JaBa")) return; - if (newMember.roles.cache.some((r) => r.name === "Поддержавшие JaBa")) { - const userData = await this.client.findOrCreateUser({ + + if (newMember?.roles.cache.some((r) => r.name === "Поддержавшие JaBa")) { + const userData = await client.findOrCreateUser({ id: newMember.id }); userData.achievements.tip.progress.now = 1; diff --git a/helpers/birthdays.js b/helpers/birthdays.js index 0e288e78..b6a2fea6 100644 --- a/helpers/birthdays.js +++ b/helpers/birthdays.js @@ -30,8 +30,8 @@ module.exports.init = async function (client) { .setAuthor({ name: client.user.username, iconURL: client.user.displayAvatarURL({ - size: 512, - format: "png" + extension: "png", + size: 512 }) }) .setColor(client.config.embed.color) diff --git a/languages/ru-RU/moderation/announcement.json b/languages/ru-RU/moderation/announcement.json deleted file mode 100644 index 01275cc7..00000000 --- a/languages/ru-RU/moderation/announcement.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DESCRIPTION": "Отправить объявление в текущий канал!", - "USAGE": "announcement [текст]", - "EXAMPLES": "announcement Новый модератор!", - "MISSING_TEXT": "Укажите текст!", - "TOO_LONG": "Текст должен быть короче 1030 символов!", - "MENTION_PROMPT": "Хотите добавить упоминание к вашему сообщению?\nОтправьте `да` или `нет`!", - "MENTION_TYPE_PROMPT": "Выберите упоминание *@*everyone написав `everyone`, либо *@*here написав `here`!", - "TITLE": "📢 Объявление:" -} \ No newline at end of file diff --git a/languages/ru-RU/music/clip.json b/languages/ru-RU/music/clip.json deleted file mode 100644 index 40894388..00000000 --- a/languages/ru-RU/music/clip.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Воспроизвести клип", - "USAGE": "clip [название-файла]", - "EXAMPLES": "clip haha", - "NO_ARG": "Укажите название файла!", - "NO_FILE": "Файл {{file}} отсутствует!", - "ACTIVE_QUEUE": "Не могу воспроизвести клип, т.к. на сервере есть активная очередь!", - "ACTIVE_CLIP": "Уже воспроизводится какой-то файл!" -} \ No newline at end of file diff --git a/languages/ru-RU/music/clips.json b/languages/ru-RU/music/clips.json index 04d8b9e8..11b5790f 100644 --- a/languages/ru-RU/music/clips.json +++ b/languages/ru-RU/music/clips.json @@ -1,6 +1,7 @@ { - "DESCRIPTION": "Показать список доступных звуков", + "DESCRIPTION": "Показать список доступных звуков и воспроизвести выбранный", "USAGE": "clips", "EXAMPLES": "clips", - "EMBED_TITLE": "**Список клипов**" + "AVAILABLE_CLIPS": "Список доступных клипов:", + "PLAYING": "Начато проигрывание клипа `{{clip}}`" } \ No newline at end of file diff --git a/languages/ru-RU/music/jump.json b/languages/ru-RU/music/jump.json index 767c0982..48a412cc 100644 --- a/languages/ru-RU/music/jump.json +++ b/languages/ru-RU/music/jump.json @@ -2,6 +2,6 @@ "DESCRIPTION": "Перейти на заданный трек", "USAGE": "jump [номер]", "EXAMPLES": "jump 3", - "NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `back`!", - "SUCCESS": "Играет выбранный трек!" + "POSITION": "Номер трека в очереди", + "NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `back`!" } \ No newline at end of file diff --git a/languages/ru-RU/music/loop.json b/languages/ru-RU/music/loop.json index ea337ea9..bcd5d70c 100644 --- a/languages/ru-RU/music/loop.json +++ b/languages/ru-RU/music/loop.json @@ -1,8 +1,10 @@ { - "DESCRIPTION": "Включить или отключить повтор очереди/одного трека!", - "USAGE": "loop (queue/all/song/single)", - "EXAMPLES": "loop queue\nloop single", - "QUEUE": "Повтор очереди **включён**!", - "SONG": "Повтор текущего трека **включён**!", + "DESCRIPTION": "Включить или отключить повтор очереди/одного трека", + "USAGE": "loop", + "EXAMPLES": "loop", + "QUEUE": "Очередь", + "SONG": "Текущий трек", + "QUEUE_ENABLED": "Повтор очереди **включён**!", + "SONG_ENABLED": "Повтор текущего трека **включён**!", "DISABLED": "Повтор **отключён**!" } \ No newline at end of file diff --git a/languages/ru-RU/music/np.json b/languages/ru-RU/music/nowplaying.json similarity index 86% rename from languages/ru-RU/music/np.json rename to languages/ru-RU/music/nowplaying.json index 92e22c4c..eb1a3efc 100644 --- a/languages/ru-RU/music/np.json +++ b/languages/ru-RU/music/nowplaying.json @@ -1,7 +1,7 @@ { - "DESCRIPTION": "Показать информацию о играющем сейчас треке!", - "USAGE": "np", - "EXAMPLES": "np", + "DESCRIPTION": "Показать информацию о играющем сейчас треке", + "USAGE": "nowplaying", + "EXAMPLES": "nowplaying", "CURRENTLY_PLAYING": "Сейчас играет", "T_TITLE": "Название", "T_CHANNEL": "Канал", diff --git a/languages/ru-RU/music/pause.json b/languages/ru-RU/music/pause.json deleted file mode 100644 index 808898e0..00000000 --- a/languages/ru-RU/music/pause.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Поставить воспроизведение очереди на паузу!", - "USAGE": "pause", - "EXAMPLES": "pause", - "SUCCESS": "⏸️ Воспроизведение очереди приостановлено." -} \ No newline at end of file diff --git a/languages/ru-RU/music/play.json b/languages/ru-RU/music/play.json index 3ffc330a..ffe0a823 100644 --- a/languages/ru-RU/music/play.json +++ b/languages/ru-RU/music/play.json @@ -1,10 +1,10 @@ { - "DESCRIPTION": "Начать воспроизведение трека!", + "DESCRIPTION": "Начать воспроизведение трека", "USAGE": "play [название-трека/ссылка]", "EXAMPLES": "play Never Gonna Give You Up", + "LINK": "Название/Прямая ссылка/Ссылка на YouTube, Spotify или SoundCloud", "NO_VOICE_CHANNEL": "Вы должны находиться в голосовом канале!", "VOICE_CHANNEL_CONNECT": "Я не могу присоедениться к вашему голосовому каналу!", - "MISSING_SONG_NAME": "Укажите название трека или ссылку на него!", "RESULTS_FOOTER": "Укажите число от 1 до 10 (без префикса).", "NO_RESULT": "Ничего не найдено!", "NOW_PLAYING": "Сейчас играет **{{songName}}**", diff --git a/languages/ru-RU/music/queue.json b/languages/ru-RU/music/queue.json index 60e18481..a0bf4a05 100644 --- a/languages/ru-RU/music/queue.json +++ b/languages/ru-RU/music/queue.json @@ -3,5 +3,8 @@ "USAGE": "queue", "EXAMPLES": "queue", "TITLE": "Очередь", + "PREVIOUS": "Пред. страница", + "NEXT": "След. страница", + "PAGE": "Страница", "ADDED": "Добавил" } \ No newline at end of file diff --git a/languages/ru-RU/music/resume.json b/languages/ru-RU/music/resume.json deleted file mode 100644 index 02c1e29e..00000000 --- a/languages/ru-RU/music/resume.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "DESCRIPTION": "Продолжает воспроизведение очереди!", - "USAGE": "resume", - "EXAMPLES": "resume", - "SUCCESS": "▶️ Воспроизведение очереди продолжается!" -} \ No newline at end of file diff --git a/languages/ru-RU/music/seek.json b/languages/ru-RU/music/seek.json index 0a7c416f..93b22a39 100644 --- a/languages/ru-RU/music/seek.json +++ b/languages/ru-RU/music/seek.json @@ -1,7 +1,7 @@ { - "DESCRIPTION": "Перемотать вперед или назад на данное время в текущем треке!", + "DESCRIPTION": "Перемотать вперед или назад на данное время в текущем треке", "USAGE": "seek [время]", "EXAMPLES": "seek 10s\nseek -10s", "INVALID_TIME": "Укажите время!", - "SUCCESS": "▶️ Трек перемотан!" + "SUCCESS": "Трек перемотан на {{time}}!" } \ No newline at end of file diff --git a/languages/ru-RU/owner/announcement.json b/languages/ru-RU/owner/announcement.json new file mode 100644 index 00000000..ce26621f --- /dev/null +++ b/languages/ru-RU/owner/announcement.json @@ -0,0 +1,8 @@ +{ + "DESCRIPTION": "Отправить объявление на все сервера где есть JaBa", + "USAGE": "announcement [текст]", + "EXAMPLES": "announcement Обновление v1.0!", + "TOO_LONG": "Текст должен быть короче 1000 символов!", + "TITLE": "📢 Объявление:", + "SENDED": "Обновление отправлено на все сервера!" +} \ No newline at end of file diff --git a/languages/ru-RU/owner/reload.json b/languages/ru-RU/owner/reload.json index b71f43bc..e3520e35 100644 --- a/languages/ru-RU/owner/reload.json +++ b/languages/ru-RU/owner/reload.json @@ -2,5 +2,6 @@ "DESCRIPTION": "Перезагрузить команду!", "COMMAND": "Команда", "EXAMPLES": "reload help", + "AVAILABLE_COMMANDS": "Доступные команды:", "SUCCESS": "Команда `{{command}}` успешно перезагружена!" } \ No newline at end of file diff --git a/languages/uk-UA/moderation/announcement.json b/languages/uk-UA/owner/announcement.json similarity index 100% rename from languages/uk-UA/moderation/announcement.json rename to languages/uk-UA/owner/announcement.json diff --git a/package-lock.json b/package-lock.json index a4d2dcb1..2f9783d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "jaba", - "version": "TEST", + "version": "4.0pre1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "jaba", - "version": "TEST", + "version": "4.0pre1", "license": "ISC", "dependencies": { "@discordjs/opus": "^0.8.0", @@ -24,11 +24,11 @@ "chalk": "^4.1.0", "colors-generator": "^0.3.4", "cron": "^1.7.2", - "customizable-discordjs-pagination": "^1.3.1", "discord-api-types": "^0.37.0", "discord-giveaways": "^6.0.0", "discord-together": "^1.3.3", - "discord.js": "^14.1.1", + "discord.js": "^14.1.2", + "discord.js-embed-pagination": "^1.0.2", "distube": "^4.0.3", "ejs": "^3.1.3", "express": "^4.17.1", @@ -37,6 +37,7 @@ "gamedig": "^4.0.2", "i18next": "^20.2.2", "i18next-node-fs-backend": "^2.1.3", + "libsodium-wrappers": "^0.7.10", "markdown-table": "2.0.0", "mathjs": "^9.0.0", "md5": "^2.2.1", @@ -1305,11 +1306,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/customizable-discordjs-pagination": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/customizable-discordjs-pagination/-/customizable-discordjs-pagination-1.3.1.tgz", - "integrity": "sha512-6kjYOWKi+4zNs3Os3MvOi2ZqGFmMZgbhXOJRQszbEkAJTvpVtbhzPoDsU222QMk5HfmV2y10NOO9bjpDrRTS/w==" - }, "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -1521,9 +1517,9 @@ "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" }, "node_modules/discord.js": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.1.tgz", - "integrity": "sha512-6Oa2f+Y0+s6B5HTTqcAP7Z6tUmguNTKpzbuTmE1JIeT/aUTr9dVe397D/bvcBSRpJERQzMyEWyEiVQnMRHcx4A==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.2.tgz", + "integrity": "sha512-apdWNLkjAkeEnuNpB8H6rS/4OgrXQlSAjuuzeodjCOdIXy3OwOjD314V/HiSttcAlr9+r3ONhaT5qvbDad5SIg==", "dependencies": { "@discordjs/builders": "^1.1.0", "@discordjs/collection": "^1.0.1", @@ -1541,6 +1537,11 @@ "node": ">=16.9.0" } }, + "node_modules/discord.js-embed-pagination": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/discord.js-embed-pagination/-/discord.js-embed-pagination-1.0.2.tgz", + "integrity": "sha512-TgGCsJg0G49q9IIMB18AncJ8u0a6TmpFdsA74uMRGEYyt3sa34JBEwxY4KuZK30tQDxPmb3N8GPCoiUg7gpJ+w==" + }, "node_modules/discord.js/node_modules/discord-api-types": { "version": "0.36.3", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", @@ -2975,6 +2976,19 @@ "node": ">= 0.8.0" } }, + "node_modules/libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "node_modules/libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "dependencies": { + "libsodium": "^0.7.0" + } + }, "node_modules/lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", @@ -5709,11 +5723,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, - "customizable-discordjs-pagination": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/customizable-discordjs-pagination/-/customizable-discordjs-pagination-1.3.1.tgz", - "integrity": "sha512-6kjYOWKi+4zNs3Os3MvOi2ZqGFmMZgbhXOJRQszbEkAJTvpVtbhzPoDsU222QMk5HfmV2y10NOO9bjpDrRTS/w==" - }, "dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -5871,9 +5880,9 @@ } }, "discord.js": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.1.tgz", - "integrity": "sha512-6Oa2f+Y0+s6B5HTTqcAP7Z6tUmguNTKpzbuTmE1JIeT/aUTr9dVe397D/bvcBSRpJERQzMyEWyEiVQnMRHcx4A==", + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.2.tgz", + "integrity": "sha512-apdWNLkjAkeEnuNpB8H6rS/4OgrXQlSAjuuzeodjCOdIXy3OwOjD314V/HiSttcAlr9+r3ONhaT5qvbDad5SIg==", "requires": { "@discordjs/builders": "^1.1.0", "@discordjs/collection": "^1.0.1", @@ -5895,6 +5904,11 @@ } } }, + "discord.js-embed-pagination": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/discord.js-embed-pagination/-/discord.js-embed-pagination-1.0.2.tgz", + "integrity": "sha512-TgGCsJg0G49q9IIMB18AncJ8u0a6TmpFdsA74uMRGEYyt3sa34JBEwxY4KuZK30tQDxPmb3N8GPCoiUg7gpJ+w==" + }, "distube": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.3.tgz", @@ -6993,6 +7007,19 @@ "type-check": "~0.4.0" } }, + "libsodium": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.10.tgz", + "integrity": "sha512-eY+z7hDrDKxkAK+QKZVNv92A5KYkxfvIshtBJkmg5TSiCnYqZP3i9OO9whE79Pwgm4jGaoHgkM4ao/b9Cyu4zQ==" + }, + "libsodium-wrappers": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.10.tgz", + "integrity": "sha512-pO3F1Q9NPLB/MWIhehim42b/Fwb30JNScCNh8TcQ/kIc+qGLQch8ag8wb0keK3EP5kbGakk1H8Wwo7v+36rNQg==", + "requires": { + "libsodium": "^0.7.0" + } + }, "lodash.deburr": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", diff --git a/package.json b/package.json index 591f4e51..a992d59b 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "jaba", - "version": "TEST", - "description": "A very complete Discord bot (more than 100 commands) that uses the Discord.js", + "version": "4.0pre1", + "description": "My Discord Bot", "main": "index.js", "private": true, "scripts": { @@ -27,11 +27,11 @@ "chalk": "^4.1.0", "colors-generator": "^0.3.4", "cron": "^1.7.2", - "customizable-discordjs-pagination": "^1.3.1", "discord-api-types": "^0.37.0", "discord-giveaways": "^6.0.0", "discord-together": "^1.3.3", - "discord.js": "^14.1.1", + "discord.js": "^14.1.2", + "discord.js-embed-pagination": "^1.0.2", "distube": "^4.0.3", "ejs": "^3.1.3", "express": "^4.17.1", @@ -40,6 +40,7 @@ "gamedig": "^4.0.2", "i18next": "^20.2.2", "i18next-node-fs-backend": "^2.1.3", + "libsodium-wrappers": "^0.7.10", "markdown-table": "2.0.0", "mathjs": "^9.0.0", "md5": "^2.2.1", From b546036abc62173726b971990709d9da460c1d29 Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Wed, 3 Aug 2022 20:57:54 +0500 Subject: [PATCH 12/16] =?UTF-8?q?=D0=9C=D1=83=D0=B7=D1=8B=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=9F=D0=B0=D0=BA=D0=B5=D1=82=20discord-player=20=D0=BD=D0=B0?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BC=D0=B5=D0=BD=D1=83=20distube=20=D0=A4?= =?UTF-8?q?=D0=B8=D0=BA=D1=81=D0=B8=D0=BA=D0=B8=20=D0=B8=20=D0=BC=D0=B5?= =?UTF-8?q?=D0=BB=D0=BA=D0=B8=D0=B5=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8?= =?UTF-8?q?,=20=D0=BA=D0=B0=D0=BA=20=D0=BE=D0=B1=D1=8B=D1=87=D0=BD=D0=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/queue.js | 115 - base/JaBa.js | 68 +- commands/Music/autoplay.js | 46 - commands/Music/back.js | 17 +- commands/Music/clips.js | 13 +- commands/Music/loop.js | 41 +- commands/Music/nowplaying.js | 41 +- commands/Music/play.js | 50 +- commands/Music/queue.js | 67 + commands/Music/seek.js | 20 +- commands/Music/skip.js | 12 +- commands/Music/{jump.js => skipto.js} | 38 +- commands/Music/stop.js | 19 +- .../{messageCreate.js => MessageHandler.js} | 0 helpers/logger.js | 2 +- languages/ru-RU/music/autoplay.json | 7 - languages/ru-RU/music/clips.json | 2 + languages/ru-RU/music/loop.json | 9 +- languages/ru-RU/music/nowplaying.json | 6 +- languages/ru-RU/music/play.json | 12 +- languages/ru-RU/music/queue.json | 6 +- languages/ru-RU/music/seek.json | 2 +- .../ru-RU/music/{jump.json => skipto.json} | 6 +- package-lock.json | 2143 ++++++++--------- package.json | 17 +- 25 files changed, 1282 insertions(+), 1477 deletions(-) delete mode 100644 TO REWRITE/queue.js delete mode 100644 commands/Music/autoplay.js create mode 100644 commands/Music/queue.js rename commands/Music/{jump.js => skipto.js} (51%) rename events/{messageCreate.js => MessageHandler.js} (100%) delete mode 100644 languages/ru-RU/music/autoplay.json rename languages/ru-RU/music/{jump.json => skipto.json} (54%) diff --git a/TO REWRITE/queue.js b/TO REWRITE/queue.js deleted file mode 100644 index de3abea3..00000000 --- a/TO REWRITE/queue.js +++ /dev/null @@ -1,115 +0,0 @@ -const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); -const BaseCommand = require("../../base/BaseCommand"), - { sendPaginatedEmbeds } = require("discord.js-embed-pagination"); - -class Queue extends BaseCommand { - /** - * - * @param {import("../base/JaBa")} client - */ - constructor(client) { - super({ - command: new SlashCommandBuilder() - .setName("queue") - .setDescription(client.translate("music/queue:DESCRIPTION")), - aliases: [], - dirname: __dirname, - guildOnly: true, - ownerOnly: false - }); - } - /** - * - * @param {import("../../base/JaBa")} client - */ - async onLoad() { - //... - } - /** - * - * @param {import("../../base/JaBa")} client - * @param {import("discord.js").ChatInputCommandInteraction} interaction - * @param {Array} data - */ - async execute(client, interaction) { - const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); - if (!queue) return interaction.error("music/play:NOT_PLAYING"); - - if (queue.songs.length === 1) { - const embed = new EmbedBuilder() - .setAuthor({ - name: interaction.translate("music/queue:TITLE"), - iconURL: interaction.guild.iconURL() - }) - .addFields([ - { - name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), - value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` - } - ]) - .setColor(client.config.embed.color); - return interaction.reply({ - embeds: [embed] - }); - } - - const songs = queue.songs.slice(1, queue.songs.length).map(song => { - return { - name: interaction.translate("music/queue:TITLE"), - value: `**${queue.songs.indexOf(song)}**. [${song.name}](${song.url})\n*${interaction.translate("music/queue:ADDED")} ${song.member}*\n` - }; - }); - - const pages = songs.map(song => { - new EmbedBuilder() - .setAuthor({ - name: interaction.translate("music/queue:TITLE"), - iconURL: interaction.guild.iconURL() - }) - .setColor(client.config.embed.color) - .addFields([ - // { - // name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), - // value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` - // }, - ...songs - ]); - }); - - sendPaginatedEmbeds(interaction, pages, { - previousLabel: interaction.translate("music/queue:"), - nextLabel: interaction.translate("music/queue:"), - pageLabel: interaction.translate("music/queue:"), - content: `${interaction.translate("music/nowplaying:CURRENTLY_PLAYING")}\n[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n`, - showPagePosition: true, - time: 120000 - }); - - // FieldsEmbed.embed - // .setColor(client.config.embed.color) - // .setAuthor({ - // name: interaction.translate("music/queue:TITLE"), - // iconURL: interaction.guild.iconURL() - // }) - // .addFields([ - // { - // name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), - // value: `[${queue.songs[0].name}](${queue.songs[0].url})\n*${interaction.translate("music/queue:ADDED")} ${queue.songs[0].member}*\n` - // } - // ]); - // FieldsEmbed - // .setArray(queue.songs[1] ? queue.songs.slice(1, queue.songs.length) : []) - // .setAuthorizedUsers([interaction.member.id]) - // .setChannel(interaction.channel) - // .setElementsPerPage(5) - // .setDeleteOnTimeout(true) - // .setPageIndicator(true) - // .formatField(interaction.translate("music/queue:TITLE"), (track) => `**${queue.songs.indexOf(track)}**. [${track.name}](${track.url})\n*${interaction.translate("music/queue:ADDED")} ${track.member}*\n`) - // .build(); - } -} - -module.exports = Queue; \ No newline at end of file diff --git a/base/JaBa.js b/base/JaBa.js index 7fac3148..c7c084a9 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -1,8 +1,9 @@ -const { EmbedBuilder, Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder } = require("discord.js"), +const {/* EmbedBuilder, */Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder } = require("discord.js"), { GiveawaysManager } = require("discord-giveaways"), - { SoundCloudPlugin } = require("@distube/soundcloud"), - { SpotifyPlugin } = require("@distube/spotify"), - { YtDlpPlugin } = require("@distube/yt-dlp"), + // { SoundCloudPlugin } = require("@distube/soundcloud"), + // { SpotifyPlugin } = require("@distube/spotify"), + // { YtDlpPlugin } = require("@distube/yt-dlp"), + { Player } = require("discord-player"), { REST } = require("@discordjs/rest"), { Routes } = require("discord-api-types/v10"); @@ -13,7 +14,7 @@ const BaseEvent = require("./BaseEvent.js"), path = require("path"), fs = require("fs").promises, mongoose = require("mongoose"), - DisTube = require("distube"), + // DisTube = require("distube"), moment = require("moment"); moment.relativeTimeThreshold("s", 60); @@ -52,60 +53,35 @@ class JaBa extends Client { this.discordTogether = new DiscordTogether(this); - this.player = new DisTube.default(this, { - plugins: [ - new SpotifyPlugin({ - emitEventsAfterFetching: true - }), - new SoundCloudPlugin(), - new YtDlpPlugin() - ], - directLink: true, - emitNewSongOnly: true, - leaveOnEmpty: true, - leaveOnFinish: true, - leaveOnStop: true, - searchSongs: 10, - searchCooldown: 30, - emptyCooldown: 10, - emitAddListWhenCreatingQueue: false, - emitAddSongWhenCreatingQueue: false + this.player = new Player(this, { + autoRegisterExtractor: true, + leaveOnEnd: true, + leaveOnStop: true }); this.player - .on("playSong", async (queue, song) => { - const m = await queue.textChannel.send({ content: this.translate("music/play:NOW_PLAYING", { songName: song.name }, queue.textChannel.guild.data.language) }); - if (song.duration > 1) { + .on("trackStart", async (queue, track) => { + const m = await queue.metadata.channel.send({ content: this.translate("music/play:NOW_PLAYING", { songName: track.title }, queue.metadata.channel.guild.data.language) }); + if (track.durationMS > 1) { setTimeout(() => { if (m.deletable) m.delete(); - }, song.duration * 1000); + }, track.durationMS * 1000); } else { setTimeout(() => { if (m.deletable) m.delete(); }, 10 * 60 * 1000); // m * s * ms } }) - .on("addSong", (queue, song) => queue.textChannel.send({ content: this.translate("music/play:ADDED_QUEUE", { songName: song.name }, queue.textChannel.guild.data.language) })) - .on("addList", (queue, playlist) => queue.textChannel.send({ content: this.translate("music/play:ADDED_QUEUE_COUNT", { songCount: `**${playlist.songs.length}** ${this.getNoun(playlist.songs.length, this.translate("misc:NOUNS:TRACKS:1"), this.translate("misc:NOUNS:TRACKS:1"), this.translate("misc:NOUNS:TRACKS:2"), this.translate("misc:NOUNS:TRACKS:5"))}` }, queue.textChannel.guild.data.language) })) - .on("searchResult", (message, result) => { - let i = 0; - const embed = new EmbedBuilder() - .setDescription(result.map(song => `**${++i}** - ${song.name}`).join("\n")) - .setFooter({ text: this.translate("music/play:RESULTS_FOOTER", null, message.guild.data.language) }) - .setColor(this.config.embed.color); - message.reply({ embeds: [embed] }); - }) - .on("searchDone", () => {}) - .on("searchCancel", message => message.error("misc:TIMES_UP")) - .on("searchInvalidAnswer", message => message.error("misc:INVALID_NUMBER_RANGE", { min: 1, max: 10 })) - .on("searchNoResult", message => message.error("music/play:NO_RESULT")) - .on("error", (textChannel, e) => { + .on("queueEnd", queue => queue.metadata.channel.send(this.translate("music/play:QUEUE_ENDED", null, queue.metadata.channel.guild.data.language))) + .on("channelEmpty", queue => queue.metadata.channel.send(this.translate("music/play:STOP_EMPTY", null, queue.metadata.channel.guild.data.language))) + .on("connectionError", (queue, e) => { console.error(e); - textChannel.send({ content: this.translate("music/play:ERR_OCCURRED", { error: e }, textChannel.guild.data.language) }); + queue.metadata.channel.send({ content: this.translate("music/play:ERR_OCCURRED", { error: e.message }, queue.metadata.channel.guild.data.language) }); }) - .on("finish", queue => queue.textChannel.send(this.translate("music/play:QUEUE_ENDED", null, queue.textChannel.guild.data.language))) - // .on("disconnect", queue => queue.textChannel.send(this.translate("music/play:STOP_DISCONNECTED", null, queue.textChannel.guild.data.language))) - .on("empty", queue => queue.textChannel.send(this.translate("music/play:STOP_EMPTY", null, queue.textChannel.guild.data.language))); + .on("error", (queue, e) => { + console.error(e); + queue.metadata.channel.send({ content: this.translate("music/play:ERR_OCCURRED", { error: e.message }, queue.metadata.channel.guild.data.language) }); + }); this.giveawaysManager = new GiveawaysManager(this, { storage: "./giveaways.json", diff --git a/commands/Music/autoplay.js b/commands/Music/autoplay.js deleted file mode 100644 index 43bbc9eb..00000000 --- a/commands/Music/autoplay.js +++ /dev/null @@ -1,46 +0,0 @@ -const { SlashCommandBuilder } = require("discord.js"); -const BaseCommand = require("../../base/BaseCommand"); - -class AutoPlay extends BaseCommand { - /** - * - * @param {import("../base/JaBa")} client - */ - constructor(client) { - super({ - command: new SlashCommandBuilder() - .setName("autoplay") - .setDescription(client.translate("music/autoplay:DESCRIPTION")), - aliases: [], - dirname: __dirname, - guildOnly: true, - ownerOnly: false - }); - } - /** - * - * @param {import("../../base/JaBa")} client - */ - async onLoad() { - //... - } - /** - * - * @param {import("../../base/JaBa")} client - * @param {import("discord.js").ChatInputCommandInteraction} interaction - * @param {Array} data - */ - async execute(client, interaction) { - const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { ephemeral: true }); - if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { ephemeral: true }); - - const autoplay = queue.toggleAutoplay(); - - interaction.success(`music/autoplay:SUCCESS_${autoplay ? "ENABLED" : "DISABLED"}`); - } -} - -module.exports = AutoPlay; \ No newline at end of file diff --git a/commands/Music/back.js b/commands/Music/back.js index dd038e70..2e2ee271 100644 --- a/commands/Music/back.js +++ b/commands/Music/back.js @@ -32,27 +32,24 @@ class Back extends BaseCommand { */ async execute(client, interaction) { const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL", null, { ephemeral: true }); + const queue = client.player.getQueue(interaction.guildId); if (!queue) return interaction.error("music/play:NOT_PLAYING", null, { ephemeral: true }); - if (!queue.previousSongs[0]) return interaction.error("music/back:NO_PREV_SONG", null, { ephemeral: true }); + if (!queue.previousTracks[0]) return interaction.error("music/back:NO_PREV_SONG", null, { ephemeral: true }); const embed = new EmbedBuilder() .setAuthor({ - name: interaction.translate("music/back:DESCRIPTION") + name: interaction.translate("music/back:SUCCESS") }) - .setThumbnail(queue.tracks[0].thumbnail) - .setDescription(interaction.translate("music/back:SUCCESS")) + .setThumbnail(queue.current.thumbnail) + .setDescription(`[${queue.current.title}](${queue.current.url})`) .setColor(client.config.embed.color) .setFooter({ text: client.config.embed.footer }); - client.player.previous(interaction); - interaction.reply({ - embeds: [embed] - }); + queue.back() + .then(() => interaction.reply({ embeds: [embed] })); } } diff --git a/commands/Music/clips.js b/commands/Music/clips.js index 0f38a54c..13a74431 100644 --- a/commands/Music/clips.js +++ b/commands/Music/clips.js @@ -54,7 +54,6 @@ class Clips extends BaseCommand { const msg = await interaction.reply({ content: interaction.translate("music/clips:AVAILABLE_CLIPS"), - ephemeral: true, components: [row], fetchReply: true }); @@ -68,13 +67,11 @@ class Clips extends BaseCommand { collector.on("collect", async msg => { const clip = msg?.values[0]; const voice = msg.member.voice.channel; - const queue = client.player.getQueue(msg); - - if (!voice) return msg.error("music/play:NO_VOICE_CHANNEL"); - if (getVoiceConnection(msg.guild.id)) return msg.error("music/clip:ACTIVE_CLIP"); - if (queue) return msg.error("music/clip:ACTIVE_QUEUE"); - if (!clip) return msg.error("music/clip:NO_ARG"); - if (!fs.existsSync(`./clips/${clip}.mp3`)) return msg.error("music/clip:NO_FILE", { file: clip }); + if (!voice) return msg.update({ content: interaction.translate("music/play:NO_VOICE_CHANNEL"), components: [] }); + const queue = client.player.getQueue(msg.guild.id); + if (queue) return msg.update({ content: interaction.translate("music/clips:ACTIVE_QUEUE"), components: [] }); + if (getVoiceConnection(msg.guild.id)) return msg.update({ content: interaction.translate("music/clips:ACTIVE_CLIP"), components: [] }); + if (!fs.existsSync(`./clips/${clip}.mp3`)) return msg.update({ content: interaction.translate("music/clips:NO_FILE", { file: clip }), components: [] }); try { const connection = joinVoiceChannel({ diff --git a/commands/Music/loop.js b/commands/Music/loop.js index 75826b28..015a82ce 100644 --- a/commands/Music/loop.js +++ b/commands/Music/loop.js @@ -1,4 +1,5 @@ -const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"); +const { SlashCommandBuilder, ActionRowBuilder, SelectMenuBuilder, InteractionCollector, ComponentType } = require("discord.js"), + { QueueRepeatMode } = require("discord-player"); const BaseCommand = require("../../base/BaseCommand"); class Loop extends BaseCommand { @@ -32,31 +33,37 @@ class Loop extends BaseCommand { */ async execute(client, interaction) { const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + const queue = client.player.getQueue(interaction.guildId); if (!queue) return interaction.error("music/play:NOT_PLAYING"); const row = new ActionRowBuilder() .addComponents( new SelectMenuBuilder() - .setCustomId("nsfw_select") + .setCustomId("loop_select") .setPlaceholder(client.translate("common:NOTHING_SELECTED")) .addOptions([ { - label: client.translate("music/loop:QUEUE"), - value: "queue" + label: client.translate("music/loop:AUTOPLAY"), + value: QueueRepeatMode.AUTOPLAY.toString() }, { - label: client.translate("music/loop:SONG"), - value: "song" + label: client.translate("music/loop:QUEUE"), + value: QueueRepeatMode.QUEUE.toString() + }, + { + label: client.translate("music/loop:TRACK"), + value: QueueRepeatMode.TRACK.toString() + }, + { + label: client.translate("music/loop:DISABLE"), + value: QueueRepeatMode.OFF.toString() } ]) ); const msg = await interaction.reply({ content: interaction.translate("common:AVAILABLE_CATEGORIES"), - ephemeral: true, components: [row], fetchReply: true }); @@ -68,19 +75,11 @@ class Loop extends BaseCommand { }); collector.on("collect", async msg => { - const type = msg?.values[0]; - let mode = null; - - if (type === "queue") { - mode = client.player.setRepeatMode(interaction, 2); - } else if (type === "song") { - mode = client.player.setRepeatMode(interaction, 1); - } else { - mode = client.player.setRepeatMode(interaction, 0); - } - + const type = Number(msg?.values[0]); + queue.setRepeatMode(type); await msg.update({ - content: `music/loop:${mode ? mode === 2 ? "QUEUE_ENABLED" : "SONG_ENABLED" : "DISABLED"}`, + content: interaction.translate(`music/loop:${type === 3 ? "AUTOPLAY_ENABLED" : + type === 2 ? "QUEUE_ENABLED" : type === 1 ? "TRACK_ENABLED" : "LOOP_DISABLED"}`), components: [] }); }); diff --git a/commands/Music/nowplaying.js b/commands/Music/nowplaying.js index c9445a2a..c75da68e 100644 --- a/commands/Music/nowplaying.js +++ b/commands/Music/nowplaying.js @@ -1,4 +1,5 @@ -const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"), + { QueueRepeatMode } = require("discord-player"); const BaseCommand = require("../../base/BaseCommand"); class Nowplaying extends BaseCommand { @@ -31,24 +32,11 @@ class Nowplaying extends BaseCommand { * @param {Array} data */ async execute(client, interaction) { - const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + await interaction.deferReply(); + const queue = client.player.getQueue(interaction.guildId); if (!queue) return interaction.error("music/play:NOT_PLAYING"); - - const track = queue.songs[0]; - - const status = queue => - `${interaction.translate("music/nowplaying:REPEAT")}: \`${ - queue.repeatMode - ? queue.repeatMode === 2 ? interaction.translate("music/nowplaying:QUEUE") : interaction.translate("music/nowplaying:SONG") - : interaction.translate("music/nowplaying:DISABLED") - }\` | ${interaction.translate("music/nowplaying:AUTOPLAY")}: \`${ - queue.autoplay - ? interaction.translate("music/nowplaying:ENABLED") - : interaction.translate("music/nowplaying:DISABLED") - }\``; + const progressBar = queue.createProgressBar(); + const track = queue.current; const embed = new EmbedBuilder() .setAuthor({ @@ -58,19 +46,22 @@ class Nowplaying extends BaseCommand { .addFields([ { name: interaction.translate("music/nowplaying:T_TITLE"), - value: `[${track.name}](${track.url})` + value: `[${track.title}](${track.url})` }, { - name: interaction.translate("music/nowplaying:T_CHANNEL"), - value: track.uploader.name || interaction.translate("common:UNKNOWN") + name: interaction.translate("music/nowplaying:T_AUTHOR"), + value: track.author || interaction.translate("common:UNKNOWN") }, { name: interaction.translate("music/nowplaying:T_DURATION"), - value: `${queue.formattedCurrentTime} / ${track.duration > 1 ? track.formattedDuration : interaction.translate("music/play:LIVE")}` + value: progressBar }, { - name: interaction.translate("music/nowplaying:T_CONF"), - value: status(queue) + name: "\u200b", + value: `${interaction.translate("music/nowplaying:REPEAT")}: \`${ + queue.repeatMode === QueueRepeatMode.AUTOPLAY ? interaction.translate("music/nowplaying:AUTOPLAY") : queue.repeatMode === QueueRepeatMode.QUEUE ? interaction.translate("music/nowplaying:QUEUE") : queue.repeatMode === QueueRepeatMode.TRACK ? interaction.translate("music/nowplaying:TRACK") + : interaction.translate("music/nowplaying:DISABLED") + }\`` } ]) .setColor(client.config.embed.color) @@ -79,7 +70,7 @@ class Nowplaying extends BaseCommand { }) .setTimestamp(); - interaction.reply({ + interaction.editReply({ embeds: [embed] }); } diff --git a/commands/Music/play.js b/commands/Music/play.js index c2a7ef08..d4c77542 100644 --- a/commands/Music/play.js +++ b/commands/Music/play.js @@ -1,4 +1,5 @@ -const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"); +const { SlashCommandBuilder, PermissionsBitField } = require("discord.js"), + { QueryType } = require("discord-player"); const BaseCommand = require("../../base/BaseCommand"); class Play extends BaseCommand { @@ -11,8 +12,8 @@ class Play extends BaseCommand { command: new SlashCommandBuilder() .setName("play") .setDescription(client.translate("music/play:DESCRIPTION")) - .addStringOption(option => option.setName("link") - .setDescription(client.translate("music/play:LINK")) + .addStringOption(option => option.setName("query") + .setDescription(client.translate("music/play:QUERY")) .setRequired(true)), aliases: [], dirname: __dirname, @@ -35,24 +36,51 @@ class Play extends BaseCommand { */ async execute(client, interaction) { await interaction.deferReply(); - const voice = interaction.member.voice.channel; - const link = interaction.options.getString("link"); if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); - + const query = interaction.options.getString("query"); const perms = voice.permissionsFor(client.user); if (!perms.has(PermissionsBitField.Flags.Connect) || !perms.has(PermissionsBitField.Flags.Speak)) return interaction.error("music/play:VOICE_CHANNEL_CONNECT"); + const searchResult = await client.player.search(query, { + requestedBy: interaction.user, + searchEngine: query.includes("soundcloud") ? QueryType.SOUNDCLOUD_SEARCH : QueryType.AUTO + }).catch(() => {}); + if (!searchResult || !searchResult.tracks.length) return interaction.editReply({ + content: interaction.translate("music/play:NO_RESULT", { + query + }) + }); + + const queue = client.player.getQueue(interaction.guildId) || client.player.createQueue(interaction.guild, { + metadata: { + channel: interaction.channel + }, + ytdlOptions: { + filter: "audioonly", + highWaterMark: 1 << 30, + dlChunkSize: 0, + liveBuffer: 4900 + } + }); + + if (!queue.tracks[0]) { + searchResult.playlist ? queue.addTracks(searchResult.tracks) : queue.addTrack(searchResult.tracks[0]); + } else { + searchResult.playlist ? searchResult.tracks.forEach(track => queue.insert(track)) : queue.insert(searchResult.tracks[0]); + } + try { - client.player.play(interaction.member.voice.channel, link, { - member: interaction.member, - textChannel: interaction.channel - }); + if (!queue.connection) await queue.connect(interaction.member.voice.channel); + if (!queue.playing) await queue.play(); interaction.editReply({ - content: interaction.translate("music/play:ADDED_QUEUE", { songName: link }) + content: interaction.translate("music/play:ADDED_QUEUE", { + songName: searchResult.playlist ? searchResult.playlist.title : searchResult.tracks[0].title + }) }); } catch (e) { + client.player.deleteQueue(interaction.guildId); interaction.error("music/play:ERR_OCCURRED", { error: e }); diff --git a/commands/Music/queue.js b/commands/Music/queue.js new file mode 100644 index 00000000..d4691796 --- /dev/null +++ b/commands/Music/queue.js @@ -0,0 +1,67 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Queue extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("queue") + .setDescription(client.translate("music/queue:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const queue = client.player.getQueue(interaction.guildId); + if (!queue) return interaction.error("music/play:NOT_PLAYING"); + + const currentTrack = queue.current; + const tracks = queue.tracks.slice(0, 10).map((t, i) => { + return `${i}. [${t.title}](${t.url})\n> ${interaction.translate("music/queue:ADDED")} ${t.requestedBy}`; + }); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("music/queue:TITLE"), + iconURL: interaction.guild.iconURL() + }) + .setColor(client.config.embed.color) + .addFields( + { + name: interaction.translate("music/nowplaying:CURRENTLY_PLAYING"), + value: `[${currentTrack.title}](${currentTrack.url})\n> ${interaction.translate("music/queue:ADDED")} ${currentTrack.requestedBy}` + }, + { + name: "\u200b", + value: `${tracks.join("\n")}\n${interaction.translate("music/nowplaying:MORE", { + tracks: `${queue.tracks.length - tracks.length} ${client.getNoun(queue.tracks.length - tracks.length, interaction.translate("misc:NOUNS:TRACKS:1"), interaction.translate("misc:NOUNS:TRACKS:2"), interaction.translate("misc:NOUNS:TRACKS:5"))}` + })}` + } + ); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Queue; \ No newline at end of file diff --git a/commands/Music/seek.js b/commands/Music/seek.js index b85eaf6e..06e8d390 100644 --- a/commands/Music/seek.js +++ b/commands/Music/seek.js @@ -1,6 +1,5 @@ const { SlashCommandBuilder } = require("discord.js"); -const BaseCommand = require("../../base/BaseCommand"), - ms = require("ms"); +const BaseCommand = require("../../base/BaseCommand"); class Seek extends BaseCommand { /** @@ -12,8 +11,8 @@ class Seek extends BaseCommand { command: new SlashCommandBuilder() .setName("seek") .setDescription(client.translate("music/seek:DESCRIPTION")) - .addStringOption(option => option.setName("time") - .setDescription("music/seek:TIME") + .addIntegerOption(option => option.setName("time") + .setDescription(client.translate("music/seek:TIME")) .setRequired(true)), aliases: [], dirname: __dirname, @@ -36,18 +35,13 @@ class Seek extends BaseCommand { */ async execute(client, interaction) { const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - const time = ms(interaction.options.getString("time")) / 1000; - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + const queue = client.player.getQueue(interaction.guildId); if (!queue) return interaction.error("music/play:NOT_PLAYING"); - if (isNaN(time)) return interaction.error("music/seek:INVALID_TIME"); + const time = interaction.options.getInteger("time"); - await client.player.seek(interaction, time); - - interaction.replyT("music/seek:SUCCESS", { - time: ms(interaction.options.getString("time")) - }); + queue.seek(time) + .then(() => interaction.replyT("music/seek:SUCCESS", { time: `${time} ${client.getNoun(time, interaction.translate("misc:NOUNS:SECONDS:1"), interaction.translate("misc:NOUNS:SECONDS:2"), interaction.translate("misc:NOUNS:SECONDS:5"))}` })); } } diff --git a/commands/Music/skip.js b/commands/Music/skip.js index 883238bb..1cb87255 100644 --- a/commands/Music/skip.js +++ b/commands/Music/skip.js @@ -32,25 +32,25 @@ class Skip extends BaseCommand { */ async execute(client, interaction) { const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + const queue = client.player.getQueue(interaction.guildId); if (!queue) return interaction.error("music/play:NOT_PLAYING"); - if (!queue.songs[1]) return interaction.error("music/skip:NO_NEXT_SONG"); + if (!queue.tracks[1]) return interaction.error("music/skip:NO_NEXT_SONG"); const embed = new EmbedBuilder() .setAuthor({ name: interaction.translate("music/skip:SUCCESS") }) - .setThumbnail(queue.songs[1].thumbnail) + .setThumbnail(queue.tracks[1].thumbnail) .setDescription(interaction.translate("music/play:NOW_PLAYING", { - songName: queue.songs[1].name + songName: queue.tracks[1].name })) .setFooter({ text: client.config.embed.footer }) .setColor(client.config.embed.color); - client.player.skip(interaction); + + queue.skip(); interaction.reply({ embeds: [embed] diff --git a/commands/Music/jump.js b/commands/Music/skipto.js similarity index 51% rename from commands/Music/jump.js rename to commands/Music/skipto.js index 4e81dcd1..e6caeb05 100644 --- a/commands/Music/jump.js +++ b/commands/Music/skipto.js @@ -1,7 +1,7 @@ -const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); -class Jump extends BaseCommand { +class Skipto extends BaseCommand { /** * * @param {import("../base/JaBa")} client @@ -9,10 +9,10 @@ class Jump extends BaseCommand { constructor(client) { super({ command: new SlashCommandBuilder() - .setName("jump") - .setDescription(client.translate("music/jump:DESCRIPTION")) + .setName("skipto") + .setDescription(client.translate("music/skipto:DESCRIPTION")) .addIntegerOption(option => option.setName("position") - .setDescription("music/jump:POSITION") + .setDescription(client.translate("music/skipto:POSITION")) .setRequired(true)), aliases: [], dirname: __dirname, @@ -34,32 +34,22 @@ class Jump extends BaseCommand { * @param {Array} data */ async execute(client, interaction) { - const queue = client.player.getQueue(interaction); const voice = interaction.member.voice.channel; + const queue = client.player.getQueue(interaction.guildId); const position = interaction.options.getInteger("position"); if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); if (!queue) return interaction.error("music/play:NOT_PLAYING"); - if (position < 0) return interaction.error("music/jump:NO_PREV_SONG"); + if (position < 0) return interaction.error("music/skipto:NO_PREV_SONG"); - const embed = new EmbedBuilder() - .setAuthor({ - name: interaction.translate("music/jump:SUCCESS") - }) - .setThumbnail(queue.songs[position].thumbnail) - .setDescription(interaction.translate("music/play:NOW_PLAYING", { - songName: queue.songs[position].name - })) - .setFooter({ - text: client.config.embed.footer - }) - .setColor(client.config.embed.color); - client.player.jump(interaction, position); + if (queue.tracks[position]) { + queue.skipTo(queue.tracks[position]); - interaction.reply({ - embeds: [embed] - }); + interaction.success("music/skipto:SUCCESS", { + position + }); + } else return interaction.error("music/skipto:ERROR", { position }); } } -module.exports = Jump; \ No newline at end of file +module.exports = Skipto; \ No newline at end of file diff --git a/commands/Music/stop.js b/commands/Music/stop.js index 08f2d31f..f3b2dafa 100644 --- a/commands/Music/stop.js +++ b/commands/Music/stop.js @@ -1,4 +1,4 @@ -const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const { SlashCommandBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Stop extends BaseCommand { @@ -32,24 +32,13 @@ class Stop extends BaseCommand { */ async execute(client, interaction) { const voice = interaction.member.voice.channel; - const queue = client.player.getQueue(interaction); - if (!voice) return interaction.error("music/play:NO_VOICE_CHANNEL"); + const queue = client.player.getQueue(interaction.guildId); if (!queue) return interaction.error("music/play:NOT_PLAYING"); - const embed = new EmbedBuilder() - .setAuthor({ - name: interaction.translate("music/stop:DESCRIPTION") - }) - .setDescription(interaction.translate("music/stop:SUCCESS")) - .setFooter({ - text: client.config.embed.footer - }) - .setColor(client.config.embed.color); - client.player.stop(interaction); - + queue.destroy(); interaction.reply({ - embeds: [embed] + content: interaction.translate("music/stop:SUCCESS") }); } } diff --git a/events/messageCreate.js b/events/MessageHandler.js similarity index 100% rename from events/messageCreate.js rename to events/MessageHandler.js diff --git a/helpers/logger.js b/helpers/logger.js index 5b37e262..1844a21a 100644 --- a/helpers/logger.js +++ b/helpers/logger.js @@ -11,7 +11,7 @@ function dateTimePad(value, digits) { } function format(tDate) { - return (tDate.getDate() + "-" + + return (dateTimePad((tDate.getDate()), 2) + "-" + dateTimePad((tDate.getMonth() + 1), 2) + "-" + dateTimePad(tDate.getFullYear(), 2) + " " + dateTimePad(tDate.getHours(), 2) + ":" + diff --git a/languages/ru-RU/music/autoplay.json b/languages/ru-RU/music/autoplay.json deleted file mode 100644 index 110409f4..00000000 --- a/languages/ru-RU/music/autoplay.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "DESCRIPTION": "Включить или отключить автовоспроизведение", - "USAGE": "autoplay", - "EXAMPLES": "autoplay", - "SUCCESS_ENABLED": "Автовоспроизведение включено!", - "SUCCESS_DISABLED": "Автовоспроизведение выключено!" -} \ No newline at end of file diff --git a/languages/ru-RU/music/clips.json b/languages/ru-RU/music/clips.json index 11b5790f..2b8e6c07 100644 --- a/languages/ru-RU/music/clips.json +++ b/languages/ru-RU/music/clips.json @@ -3,5 +3,7 @@ "USAGE": "clips", "EXAMPLES": "clips", "AVAILABLE_CLIPS": "Список доступных клипов:", + "ACTIVE_QUEUE": "Не могу воспроизвести клип, т.к. на сервере есть активная очередь!", + "ACTIVE_CLIP": "Уже воспроизводится какой-то файл!", "PLAYING": "Начато проигрывание клипа `{{clip}}`" } \ No newline at end of file diff --git a/languages/ru-RU/music/loop.json b/languages/ru-RU/music/loop.json index bcd5d70c..38ba8760 100644 --- a/languages/ru-RU/music/loop.json +++ b/languages/ru-RU/music/loop.json @@ -2,9 +2,12 @@ "DESCRIPTION": "Включить или отключить повтор очереди/одного трека", "USAGE": "loop", "EXAMPLES": "loop", + "AUTOPLAY": "Автовоспроизведение", "QUEUE": "Очередь", - "SONG": "Текущий трек", + "TRACK": "Текущий трек", + "DISABLE": "Отключить", + "AUTOPLAY_ENABLED": "Автовоспроизведение **включено**", "QUEUE_ENABLED": "Повтор очереди **включён**!", - "SONG_ENABLED": "Повтор текущего трека **включён**!", - "DISABLED": "Повтор **отключён**!" + "TRACK_ENABLED": "Повтор текущего трека **включён**!", + "LOOP_DISABLED": "Повтор **отключён**!" } \ No newline at end of file diff --git a/languages/ru-RU/music/nowplaying.json b/languages/ru-RU/music/nowplaying.json index eb1a3efc..0eced9ea 100644 --- a/languages/ru-RU/music/nowplaying.json +++ b/languages/ru-RU/music/nowplaying.json @@ -4,16 +4,14 @@ "EXAMPLES": "nowplaying", "CURRENTLY_PLAYING": "Сейчас играет", "T_TITLE": "Название", - "T_CHANNEL": "Канал", + "T_AUTHOR": "Автор", "T_DURATION": "Длительность", - "T_CONF": "Настройки", "T_DESCRIPTION": "Описание", "NO_DESCRIPTION": "Описание отсутствует", - "FILTERS": "Фильтры", "REPEAT": "Повтор", "AUTOPLAY": "Автовоспроизведение", "QUEUE": "Очереди", - "SONG": "Трека", + "TRACK": "Трека", "ENABLED": "Вкл.", "DISABLED": "Выкл." } \ No newline at end of file diff --git a/languages/ru-RU/music/play.json b/languages/ru-RU/music/play.json index ffe0a823..f5b1c071 100644 --- a/languages/ru-RU/music/play.json +++ b/languages/ru-RU/music/play.json @@ -2,21 +2,17 @@ "DESCRIPTION": "Начать воспроизведение трека", "USAGE": "play [название-трека/ссылка]", "EXAMPLES": "play Never Gonna Give You Up", - "LINK": "Название/Прямая ссылка/Ссылка на YouTube, Spotify или SoundCloud", + "QUERY": "Название/Прямая ссылка/Ссылка на YouTube, Spotify или SoundCloud", "NO_VOICE_CHANNEL": "Вы должны находиться в голосовом канале!", "VOICE_CHANNEL_CONNECT": "Я не могу присоедениться к вашему голосовому каналу!", "RESULTS_FOOTER": "Укажите число от 1 до 10 (без префикса).", - "NO_RESULT": "Ничего не найдено!", + "NO_RESULT": "По запросу `{{query}}` ничего не найдено!", "NOW_PLAYING": "Сейчас играет **{{songName}}**", - "PLAYING_PLAYLIST": "Начинается воспроизведение плейлиста **{{playlistTitle}}**. {{playlistEmoji}}\nНачато воспроизведение первого трека, **{{songName}}**!", - "CANCELLED": "Выбор отменён", - "NOT_PLAYING": "На сервере сейчас ничего не воспроизводится.", - "QUEUE_ENDED": "Очередь окончена.", + "NOT_PLAYING": "На сервере сейчас ничего не воспроизводится", + "QUEUE_ENDED": "Очередь окончена", "ADDED_QUEUE": "**{{songName}}** добавлен в очередь!", - "ADDED_QUEUE_COUNT": "{{songCount}} добавлено в очередь!", "STOP_DISCONNECTED": "Воспроизведение окончено, т.к. я вышел из голосового канала.", "STOP_EMPTY": "Воспроизведение окончено, т.к. все вышли из голосового канала.", "RESULTS_CANCEL": "Поиск отменён!", - "LIVE": "Прямая трансляция", "ERR_OCCURRED": "Произошла ошибка, пропускаю...\n`{{error}}`" } \ No newline at end of file diff --git a/languages/ru-RU/music/queue.json b/languages/ru-RU/music/queue.json index a0bf4a05..b1d0b559 100644 --- a/languages/ru-RU/music/queue.json +++ b/languages/ru-RU/music/queue.json @@ -3,8 +3,6 @@ "USAGE": "queue", "EXAMPLES": "queue", "TITLE": "Очередь", - "PREVIOUS": "Пред. страница", - "NEXT": "След. страница", - "PAGE": "Страница", - "ADDED": "Добавил" + "ADDED": "Добавил", + "MORE": "и ещё {{tracks}}" } \ No newline at end of file diff --git a/languages/ru-RU/music/seek.json b/languages/ru-RU/music/seek.json index 93b22a39..7f299129 100644 --- a/languages/ru-RU/music/seek.json +++ b/languages/ru-RU/music/seek.json @@ -2,6 +2,6 @@ "DESCRIPTION": "Перемотать вперед или назад на данное время в текущем треке", "USAGE": "seek [время]", "EXAMPLES": "seek 10s\nseek -10s", - "INVALID_TIME": "Укажите время!", + "TIME": "Время в секундах", "SUCCESS": "Трек перемотан на {{time}}!" } \ No newline at end of file diff --git a/languages/ru-RU/music/jump.json b/languages/ru-RU/music/skipto.json similarity index 54% rename from languages/ru-RU/music/jump.json rename to languages/ru-RU/music/skipto.json index 48a412cc..796d9e08 100644 --- a/languages/ru-RU/music/jump.json +++ b/languages/ru-RU/music/skipto.json @@ -1,7 +1,9 @@ { "DESCRIPTION": "Перейти на заданный трек", - "USAGE": "jump [номер]", - "EXAMPLES": "jump 3", + "USAGE": "skipto [номер]", + "EXAMPLES": "skipto 3", "POSITION": "Номер трека в очереди", + "SUCCESS": "Выполнен переход на позицию {{position}", + "ERROR": "На позиции {{position}} ничего не найдено", "NO_PREV_SONG": "Вы не можете перейти назад, для этого используйте команду `back`!" } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2f9783d6..77edc8fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,41 +9,34 @@ "version": "4.0pre1", "license": "ISC", "dependencies": { + "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.8.0", "@discordjs/rest": "^1.0.0", "@discordjs/voice": "^0.11.0", - "@distube/soundcloud": "^1.2.1", - "@distube/spotify": "^1.3.2", - "@distube/yt-dlp": "^1.1.3", - "@distube/ytdl-core": "^4.11.3", - "@sindresorhus/slugify": "^1.1.0", "amethyste-api": "github:Androz2091/amethyste-api", "btoa": "^1.2.1", "canvacord": "^5.1.0", "canvas": "^2.9.0", "chalk": "^4.1.0", - "colors-generator": "^0.3.4", "cron": "^1.7.2", "discord-api-types": "^0.37.0", "discord-giveaways": "^6.0.0", - "discord-together": "^1.3.3", + "discord-player": "^5.3.0-dev.3", "discord.js": "^14.1.2", - "discord.js-embed-pagination": "^1.0.2", - "distube": "^4.0.3", "ejs": "^3.1.3", "express": "^4.17.1", "express-session": "^1.17.0", - "ffmpeg-static": "^4.4.0", + "ffmpeg-static": "^4.4.1", "gamedig": "^4.0.2", "i18next": "^20.2.2", "i18next-node-fs-backend": "^2.1.3", "libsodium-wrappers": "^0.7.10", "markdown-table": "2.0.0", - "mathjs": "^9.0.0", "md5": "^2.2.1", "moment": "^2.26.0", "mongoose": "^5.13.14", - "ms": "^2.1.3" + "ms": "^2.1.3", + "prism-media": "^1.3.4" }, "devDependencies": { "eslint": "^7.5.0" @@ -190,6 +183,17 @@ "node": ">=6.0.0" } }, + "node_modules/@discord-player/extractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-3.0.2.tgz", + "integrity": "sha512-bVGzucZTYksvsL7TFBhe/8ZzWuDDSc7f1fZYXS5CSu3vYez8ieG8ySAaeHdEbFKhxHIYhvUhvgY1mWcX/3ZBQA==", + "dependencies": { + "genius-lyrics": "^4.2.9", + "jsdom": "^16.5.3", + "node-fetch": "^2.6.1", + "reverbnation-scraper": "^2.0.0" + } + }, "node_modules/@discordjs/builders": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.1.0.tgz", @@ -300,109 +304,6 @@ "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" }, - "node_modules/@discordjs/voice/node_modules/prism-media": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", - "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", - "peerDependencies": { - "@discordjs/opus": "^0.8.0", - "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", - "node-opus": "^0.3.3", - "opusscript": "^0.0.8" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - }, - "ffmpeg-static": { - "optional": true - }, - "node-opus": { - "optional": true - }, - "opusscript": { - "optional": true - } - } - }, - "node_modules/@distube/soundcloud": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@distube/soundcloud/-/soundcloud-1.2.1.tgz", - "integrity": "sha512-4oeNfbbRXsZ7QmXVEm/qE/sfoUKWeZR2BboY2ajn71o4Tp8/jvxpImJl5qVXWbT6Em+e57GbJCeypi1JBwpMrQ==", - "dependencies": { - "soundcloud.ts": "^0.4.6" - }, - "peerDependencies": { - "distube": "3||4" - } - }, - "node_modules/@distube/spotify": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@distube/spotify/-/spotify-1.3.2.tgz", - "integrity": "sha512-algjtD8/D4vAAJCjBmgueQpUzG0hzVzlyqR/3jJiShx8+rs4PKbnRQsx+gRfESeBfgt0QWUHc7bHxgtWeuKyjQ==", - "dependencies": { - "isomorphic-unfetch": "^3.1.0", - "spotify-uri": "^3.0.2", - "spotify-url-info": "^3.1.2", - "spotify-web-api-node": "^5.0.2" - }, - "peerDependencies": { - "distube": "^3.3.1||4" - } - }, - "node_modules/@distube/yt-dlp": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@distube/yt-dlp/-/yt-dlp-1.1.3.tgz", - "integrity": "sha512-kInFaIgNK7bhUJwY5o/ejBpwHdtLEH9l/GPBl9G7ddMKFYx7/MA5vKZ2F3oZQVMq9pzphPMRpSGi4UBT9L6O2g==", - "hasInstallScript": true, - "dependencies": { - "dargs": "^7.0.0", - "execa": "^5.1.1", - "mkdirp": "^1.0.4", - "undici": "^5.7.0" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "distube": "3.x||4.x" - } - }, - "node_modules/@distube/ytdl-core": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@distube/ytdl-core/-/ytdl-core-4.11.3.tgz", - "integrity": "sha512-vgLdpGjVQQH7Y5PCpoUa2GuALwrAsMvrU/dxd/KI/YmkVBH0qm/nG9d3tOQvydKF/PLBk26jY+rOjFm6mqzJkg==", - "dependencies": { - "m3u8stream": "^0.8.6", - "miniget": "^4.2.2", - "sax": "^1.2.4" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@distube/ytpl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@distube/ytpl/-/ytpl-1.1.1.tgz", - "integrity": "sha512-/2I7GpdCv9SFdA4UprDGkq1y4ZkoAA1WYTZNmx/DjzZ0oVCLfxY9ZdYNQY5YwQqs4D4vNbXPvf6CliiWo5D3QA==", - "dependencies": { - "miniget": "^4.2.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@distube/ytsr": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.8.tgz", - "integrity": "sha512-/6pVd9Hiu6EbjPbbC4PKckse957LMiCYYwULWH7Ctovbc/mdPz9pT7hsFIBqx1vLXOYj6osbcfkCCbhhegSBDg==", - "dependencies": { - "miniget": "^4.2.2" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -504,42 +405,15 @@ "url": "https://github.com/sindresorhus/is?sponsor=1" } }, - "node_modules/@sindresorhus/slugify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", - "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "node_modules/@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "dependencies": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" + "defer-to-connect": "^2.0.0" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", - "dependencies": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@sindresorhus/transliterate/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "engines": { - "node": ">=8" } }, "node_modules/@tokenizer/token": { @@ -547,6 +421,14 @@ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/@types/bson": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", @@ -593,28 +475,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, - "node_modules/@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "dependencies": { - "@types/node": "*", - "form-data": "^3.0.0" - } - }, - "node_modules/@types/node-fetch/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -631,6 +491,11 @@ "@types/node": "*" } }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -652,7 +517,6 @@ "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -660,6 +524,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -669,6 +542,14 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -810,15 +691,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "node_modules/audioconcat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/audioconcat/-/audioconcat-0.1.4.tgz", - "integrity": "sha512-RH7f6n1kfQTathHadWJp8b/hz7y9GYdhKDtkqany8qYxkv0RQamY+7dFBbJOxLh86ouMTYmKYenSdkxSbubmOA==", - "dependencies": { - "fluent-ffmpeg": "^2.0.0", - "lodash.merge": "^4.6.2" - } - }, "node_modules/axios": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", @@ -923,6 +795,11 @@ "concat-map": "0.0.1" } }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, "node_modules/bson": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", @@ -955,6 +832,14 @@ "node": ">= 0.8" } }, + "node_modules/cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "engines": { + "node": ">=10.6.0" + } + }, "node_modules/cacheable-request": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", @@ -1129,11 +1014,6 @@ "color-support": "bin.js" } }, - "node_modules/colors-generator": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/colors-generator/-/colors-generator-0.3.4.tgz", - "integrity": "sha1-4UUggngekO48qFTWD4CHZvNR2qY=" - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1156,23 +1036,6 @@ "node": ">= 0.6.x" } }, - "node_modules/complex.js": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz", - "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, - "node_modules/component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "node_modules/compressjs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz", @@ -1241,11 +1104,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "node_modules/cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" - }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -1263,6 +1121,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -1306,14 +1165,72 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, "engines": { "node": ">=8" } }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -1368,8 +1285,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/deepmerge-ts": { "version": "4.2.1", @@ -1452,70 +1368,24 @@ "discord.js": ">=14.0.0" } }, - "node_modules/discord-together": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/discord-together/-/discord-together-1.3.3.tgz", - "integrity": "sha512-K2oKZllYJ8jCCtPzgjn4DtOHho5A3mrXd/ZRmIU4bERFy4TVhT9Zwo+I0JWthGohn2suTDF5GQofn9p27FXKDg==", + "node_modules/discord-player": { + "version": "5.3.0-dev.3", + "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-5.3.0-dev.3.tgz", + "integrity": "sha512-rrbEBS4mzCyIGk5S9E5O0XWnC4nub2cmBAFr9pZLH7RWBX4+z2nhAt5VwemgenmW/RJy1rseuZZ75WqJDnrHnw==", "dependencies": { - "discord.js": "^13.1.0", - "node-fetch": "^2.6.1" - } - }, - "node_modules/discord-together/node_modules/@discordjs/builders": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", - "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", - "deprecated": "no longer supported", - "dependencies": { - "@sapphire/shapeshift": "^3.5.1", - "discord-api-types": "^0.36.2", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.1", - "tslib": "^2.4.0" + "@discordjs/voice": "^0.11.0", + "libsodium-wrappers": "^0.7.10", + "soundcloud-scraper": "^5.0.3", + "spotify-url-info": "^3.1.2", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "youtube-sr": "^4.2.0", + "ytdl-core": "^4.11.0" }, - "engines": { - "node": ">=16.9.0" + "funding": { + "url": "https://github.com/Androz2091/discord-player?sponsor=1" } }, - "node_modules/discord-together/node_modules/@discordjs/collection": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", - "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==", - "deprecated": "no longer supported", - "engines": { - "node": ">=16.9.0" - } - }, - "node_modules/discord-together/node_modules/discord-api-types": { - "version": "0.36.3", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", - "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" - }, - "node_modules/discord-together/node_modules/discord.js": { - "version": "13.9.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.9.2.tgz", - "integrity": "sha512-wShFlyAyxgQcWzINeufUoT1U0fmju+pPCRzPfJB7CaA0V1tQHc4e0PpO4NQif8sLfZvrQmEILBaIJ0G5I32OxQ==", - "dependencies": { - "@discordjs/builders": "^0.16.0", - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.2", - "@types/node-fetch": "^2.6.2", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "ws": "^8.8.1" - }, - "engines": { - "node": ">=16.6.0", - "npm": ">=7.0.0" - } - }, - "node_modules/discord-together/node_modules/discord.js/node_modules/discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" - }, "node_modules/discord.js": { "version": "14.1.2", "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.1.2.tgz", @@ -1537,53 +1407,11 @@ "node": ">=16.9.0" } }, - "node_modules/discord.js-embed-pagination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/discord.js-embed-pagination/-/discord.js-embed-pagination-1.0.2.tgz", - "integrity": "sha512-TgGCsJg0G49q9IIMB18AncJ8u0a6TmpFdsA74uMRGEYyt3sa34JBEwxY4KuZK30tQDxPmb3N8GPCoiUg7gpJ+w==" - }, "node_modules/discord.js/node_modules/discord-api-types": { "version": "0.36.3", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" }, - "node_modules/distube": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.3.tgz", - "integrity": "sha512-EMR/4d1EgNtNIdTPhwBOtVKqkPX1YJBB4JwPymWIX/i6ip0451X+vZGwJamP2LFh46Usssay0ty+Dm1U0/jQ1g==", - "funding": [ - { - "type": "individual", - "url": "https://paypal.me/Skickkk" - }, - { - "type": "patreon", - "url": "https://patreon.com/DisTube" - } - ], - "dependencies": { - "@distube/ytdl-core": "^4.11.3", - "@distube/ytpl": "^1.1.1", - "@distube/ytsr": "^1.1.8", - "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", - "tiny-typed-emitter": "^2.1.0", - "tslib": "^2.4.0", - "undici": "^5.8.0" - }, - "engines": { - "node": ">=16.9.0" - }, - "peerDependencies": { - "@discordjs/opus": "*", - "@discordjs/voice": "*", - "discord.js": "14" - }, - "peerDependenciesMeta": { - "@discordjs/opus": { - "optional": true - } - } - }, "node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -1620,6 +1448,25 @@ } ] }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, "node_modules/domhandler": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", @@ -1743,15 +1590,11 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "node_modules/escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" - }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, "engines": { "node": ">=10" }, @@ -1759,6 +1602,82 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/escodegen/node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -1952,7 +1871,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -1971,28 +1889,6 @@ "integrity": "sha1-ywffzUGNoiIdkPd+q3E7wjXiCQ8=", "deprecated": "Use promise-toolbox/fromEvent instead" }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, "node_modules/express": { "version": "4.17.2", "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", @@ -2099,13 +1995,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "node_modules/ffmpeg-static": { "version": "4.4.1", @@ -2207,29 +2097,6 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "node_modules/fluent-ffmpeg": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", - "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", - "dependencies": { - "async": ">=0.2.9", - "which": "^1.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/fluent-ffmpeg/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -2254,33 +2121,11 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/form-data-encoder": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" }, - "node_modules/formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -2289,18 +2134,6 @@ "node": ">= 0.6" } }, - "node_modules/fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://www.patreon.com/infusion" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -2475,6 +2308,15 @@ "node": ">=0.10" } }, + "node_modules/genius-lyrics": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/genius-lyrics/-/genius-lyrics-4.3.8.tgz", + "integrity": "sha512-Gy5JrSoWQKAWK54qfmgJFJIgbHDhfq3vXvYRJdh5QpX0DFic+7NxA88HVtkF7NdhCGtCCS2F9YeNGDiXYXMVIw==", + "dependencies": { + "cheerio": "^1.0.0-rc.9", + "got": "^11.8.2" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -2540,6 +2382,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "dependencies": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + }, + "engines": { + "node": ">=10.19.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, "node_modules/graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -2563,6 +2429,17 @@ "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -2601,6 +2478,19 @@ "node": ">= 0.6" } }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -2614,6 +2504,18 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" }, + "node_modules/http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, "node_modules/https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -2626,14 +2528,6 @@ "node": ">= 6" } }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "engines": { - "node": ">=10.17.0" - } - }, "node_modules/i18next": { "version": "20.6.1", "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz", @@ -2784,16 +2678,10 @@ "node": ">=0.10.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "node_modules/isarray": { "version": "1.0.0", @@ -2803,16 +2691,8 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "node_modules/isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "dependencies": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "node_modules/jake": { "version": "10.8.2", @@ -2895,11 +2775,6 @@ "node": ">=4" } }, - "node_modules/javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2919,6 +2794,127 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -2989,15 +2985,16 @@ "libsodium": "^0.7.0" } }, - "node_modules/lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=" + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/lodash.snakecase": { "version": "4.1.1", @@ -3085,28 +3082,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/mathjs": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-9.5.2.tgz", - "integrity": "sha512-c0erTq0GP503/Ch2OtDOAn50GIOsuxTMjmE00NI/vKJFSWrDaQHRjx6ai+16xYv70yBSnnpUgHZGNf9FR9IwmA==", - "dependencies": { - "@babel/runtime": "^7.15.4", - "complex.js": "^2.0.15", - "decimal.js": "^10.3.1", - "escape-latex": "^1.2.0", - "fraction.js": "^4.1.1", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^2.0.0" - }, - "bin": { - "mathjs": "bin/cli.js" - }, - "engines": { - "node": ">= 12" - } - }, "node_modules/md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -3136,11 +3111,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, "node_modules/methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -3179,14 +3149,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -3481,17 +3443,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -3514,6 +3465,11 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==" + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -3549,20 +3505,6 @@ "wrappy": "1" } }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optional-require": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", @@ -3588,6 +3530,14 @@ "node": ">= 0.8.0" } }, + "node_modules/p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "engines": { + "node": ">=8" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3638,6 +3588,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "engines": { "node": ">=8" } @@ -3669,13 +3620,12 @@ } }, "node_modules/prism-media": { - "version": "1.3.3", - "resolved": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", - "integrity": "sha512-2a/62b86i60OksrnliRwG7IGMHjFHM0KiRYk6YBi43IZpCZCf/ZLjXIbMGtzzeTZhEJy1Fi6Ke6kKtn2ObNjPw==", - "license": "Apache-2.0", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", "peerDependencies": { - "@discordjs/opus": "*", - "ffmpeg-static": "^4.2.7 || ^3.0.0 || ^2.4.0", + "@discordjs/opus": "^0.8.0", + "ffmpeg-static": "^5.0.2 || ^4.2.7 || ^3.0.0 || ^2.4.0", "node-opus": "^0.3.3", "opusscript": "^0.0.8" }, @@ -3719,6 +3669,11 @@ "node": ">= 0.10" } }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "node_modules/pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -3912,6 +3867,14 @@ "lowercase-keys": "^2.0.0" } }, + "node_modules/reverbnation-scraper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reverbnation-scraper/-/reverbnation-scraper-2.0.0.tgz", + "integrity": "sha512-t1Mew5QC9QEVEry5DXyagvci2O+TgXTGoMHbNoW5NRz6LTOzK/DLHUpnrQwloX8CVX5z1a802vwHM3YgUVOvKg==", + "dependencies": { + "node-fetch": "^2.6.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3967,10 +3930,16 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "node_modules/seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } }, "node_modules/semver": { "version": "7.3.5", @@ -4058,6 +4027,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4069,6 +4039,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "engines": { "node": ">=8" } @@ -4156,40 +4127,23 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, - "node_modules/soundcloud.ts": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.7.tgz", - "integrity": "sha512-NAFdDgo695IEsSE6LbnWbKq8KqNWm/tbmwbybaoHI1tvRKb7s3Zx5kMxd8yEJFy1XUxoAfizoyu3cIyodU4Urg==", + "node_modules/soundcloud-scraper": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/soundcloud-scraper/-/soundcloud-scraper-5.0.3.tgz", + "integrity": "sha512-AmS9KmK7mMaPVzHzBk40rANpAttZila3+iAet6EA47EeiTBUzVwjq4B+1LCOLtgPmzDSGk0qn+LZOEd5UhnZTQ==", "dependencies": { - "audioconcat": "^0.1.4", - "axios": "^0.21.1" + "cheerio": "^1.0.0-rc.10", + "m3u8stream": "^0.8.4", + "node-fetch": "^2.6.1" } }, - "node_modules/soundcloud.ts/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, - "node_modules/soundcloud.ts/node_modules/follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true, "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } + "node": ">=0.10.0" } }, "node_modules/sparse-bitfield": { @@ -4221,14 +4175,6 @@ "node": ">= 12" } }, - "node_modules/spotify-web-api-node": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-5.0.2.tgz", - "integrity": "sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==", - "dependencies": { - "superagent": "^6.1.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -4288,14 +4234,6 @@ "node": ">=8" } }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "engines": { - "node": ">=6" - } - }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4324,65 +4262,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at . Thanks to @shadowgate15, @spence-s, and @niftylettuce. Superagent is sponsored by Forward Email at .", - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 7.0.0" - } - }, - "node_modules/superagent/node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/superagent/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/superagent/node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4394,6 +4273,11 @@ "node": ">=8" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "node_modules/table": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", @@ -4454,11 +4338,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, "node_modules/tiny-typed-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", @@ -4488,6 +4367,19 @@ "url": "https://github.com/sponsors/Borewit" } }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -4544,14 +4436,6 @@ "node": ">= 0.6" } }, - "node_modules/typed-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz", - "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==", - "engines": { - "node": ">= 8" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -4576,10 +4460,13 @@ "node": ">=12.18" } }, - "node_modules/unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } }, "node_modules/unpipe": { "version": "1.0.0", @@ -4630,11 +4517,43 @@ "node": ">= 0.8" } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -4648,6 +4567,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -4670,7 +4590,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -4700,6 +4619,11 @@ } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, "node_modules/xmlbuilder": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", @@ -4708,6 +4632,11 @@ "node": ">=4.0" } }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "node_modules/xmlrpc": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", @@ -4725,6 +4654,24 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/youtube-sr": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.0.tgz", + "integrity": "sha512-cRMOeJZi/DYIRqru0R9UsBLwkj4tQvekldnCj4MZOT+ijlfesrllbUDXqKuA2RbYA4ByJlFf9wxZ1ndvuCJ5Ow==" + }, + "node_modules/ytdl-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.0.tgz", + "integrity": "sha512-Q3hCLiUA9AOGQXzPvno14GN+HgF9wsO1ZBHlj0COTcyxjIyFpWvMfii0UC4/cAbVaIjEdbWB71GdcGuc4J1Lmw==", + "dependencies": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.1.3" + }, + "engines": { + "node": ">=12" + } } }, "dependencies": { @@ -4844,6 +4791,17 @@ "parse-cache-control": "^1.0.1" } }, + "@discord-player/extractor": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@discord-player/extractor/-/extractor-3.0.2.tgz", + "integrity": "sha512-bVGzucZTYksvsL7TFBhe/8ZzWuDDSc7f1fZYXS5CSu3vYez8ieG8ySAaeHdEbFKhxHIYhvUhvgY1mWcX/3ZBQA==", + "requires": { + "genius-lyrics": "^4.2.9", + "jsdom": "^16.5.3", + "node-fetch": "^2.6.1", + "reverbnation-scraper": "^2.0.0" + } + }, "@discordjs/builders": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.1.0.tgz", @@ -4937,71 +4895,9 @@ "version": "0.36.3", "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" - }, - "prism-media": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", - "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", - "requires": {} } } }, - "@distube/soundcloud": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@distube/soundcloud/-/soundcloud-1.2.1.tgz", - "integrity": "sha512-4oeNfbbRXsZ7QmXVEm/qE/sfoUKWeZR2BboY2ajn71o4Tp8/jvxpImJl5qVXWbT6Em+e57GbJCeypi1JBwpMrQ==", - "requires": { - "soundcloud.ts": "^0.4.6" - } - }, - "@distube/spotify": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@distube/spotify/-/spotify-1.3.2.tgz", - "integrity": "sha512-algjtD8/D4vAAJCjBmgueQpUzG0hzVzlyqR/3jJiShx8+rs4PKbnRQsx+gRfESeBfgt0QWUHc7bHxgtWeuKyjQ==", - "requires": { - "isomorphic-unfetch": "^3.1.0", - "spotify-uri": "^3.0.2", - "spotify-url-info": "^3.1.2", - "spotify-web-api-node": "^5.0.2" - } - }, - "@distube/yt-dlp": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@distube/yt-dlp/-/yt-dlp-1.1.3.tgz", - "integrity": "sha512-kInFaIgNK7bhUJwY5o/ejBpwHdtLEH9l/GPBl9G7ddMKFYx7/MA5vKZ2F3oZQVMq9pzphPMRpSGi4UBT9L6O2g==", - "requires": { - "dargs": "^7.0.0", - "execa": "^5.1.1", - "mkdirp": "^1.0.4", - "undici": "^5.7.0" - } - }, - "@distube/ytdl-core": { - "version": "4.11.3", - "resolved": "https://registry.npmjs.org/@distube/ytdl-core/-/ytdl-core-4.11.3.tgz", - "integrity": "sha512-vgLdpGjVQQH7Y5PCpoUa2GuALwrAsMvrU/dxd/KI/YmkVBH0qm/nG9d3tOQvydKF/PLBk26jY+rOjFm6mqzJkg==", - "requires": { - "m3u8stream": "^0.8.6", - "miniget": "^4.2.2", - "sax": "^1.2.4" - } - }, - "@distube/ytpl": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@distube/ytpl/-/ytpl-1.1.1.tgz", - "integrity": "sha512-/2I7GpdCv9SFdA4UprDGkq1y4ZkoAA1WYTZNmx/DjzZ0oVCLfxY9ZdYNQY5YwQqs4D4vNbXPvf6CliiWo5D3QA==", - "requires": { - "miniget": "^4.2.1" - } - }, - "@distube/ytsr": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@distube/ytsr/-/ytsr-1.1.8.tgz", - "integrity": "sha512-/6pVd9Hiu6EbjPbbC4PKckse957LMiCYYwULWH7Ctovbc/mdPz9pT7hsFIBqx1vLXOYj6osbcfkCCbhhegSBDg==", - "requires": { - "miniget": "^4.2.2" - } - }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -5076,29 +4972,12 @@ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" }, - "@sindresorhus/slugify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/slugify/-/slugify-1.1.2.tgz", - "integrity": "sha512-V9nR/W0Xd9TSGXpZ4iFUcFGhuOJtZX82Fzxj1YISlbSgKvIiNa7eLEZrT0vAraPOt++KHauIVNYgGRgjc13dXA==", + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", "requires": { - "@sindresorhus/transliterate": "^0.1.1", - "escape-string-regexp": "^4.0.0" - } - }, - "@sindresorhus/transliterate": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@sindresorhus/transliterate/-/transliterate-0.1.2.tgz", - "integrity": "sha512-5/kmIOY9FF32nicXH+5yLNTX4NJ4atl7jRgqAJuIn/iyDFXBktOKDxCvyGE/EzmF4ngSUvjXxQUQlQiZ5lfw+w==", - "requires": { - "escape-string-regexp": "^2.0.0", - "lodash.deburr": "^4.1.0" - }, - "dependencies": { - "escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" - } + "defer-to-connect": "^2.0.0" } }, "@tokenizer/token": { @@ -5106,6 +4985,11 @@ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" + }, "@types/bson": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz", @@ -5152,27 +5036,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.8.tgz", "integrity": "sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg==" }, - "@types/node-fetch": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.2.tgz", - "integrity": "sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==", - "requires": { - "@types/node": "*", - "form-data": "^3.0.0" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } - } - }, "@types/responselike": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", @@ -5189,6 +5052,11 @@ "@types/node": "*" } }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==" + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -5206,8 +5074,16 @@ "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } }, "acorn-jsx": { "version": "5.3.2", @@ -5216,6 +5092,11 @@ "dev": true, "requires": {} }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -5327,15 +5208,6 @@ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "audioconcat": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/audioconcat/-/audioconcat-0.1.4.tgz", - "integrity": "sha512-RH7f6n1kfQTathHadWJp8b/hz7y9GYdhKDtkqany8qYxkv0RQamY+7dFBbJOxLh86ouMTYmKYenSdkxSbubmOA==", - "requires": { - "fluent-ffmpeg": "^2.0.0", - "lodash.merge": "^4.6.2" - } - }, "axios": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", @@ -5440,6 +5312,11 @@ "concat-map": "0.0.1" } }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, "bson": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", @@ -5460,6 +5337,11 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, "cacheable-request": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", @@ -5589,11 +5471,6 @@ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, - "colors-generator": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/colors-generator/-/colors-generator-0.3.4.tgz", - "integrity": "sha1-4UUggngekO48qFTWD4CHZvNR2qY=" - }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -5610,16 +5487,6 @@ "graceful-readlink": ">= 1.0.0" } }, - "complex.js": { - "version": "2.0.15", - "resolved": "https://registry.npmjs.org/complex.js/-/complex.js-2.0.15.tgz", - "integrity": "sha512-gDBvQU8IG139ZBQTSo2qvDFP+lANMGluM779csXOr6ny1NUtA3wkUnCFjlDNH/moAVfXtvClYt6G0zarFbtz5w==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, "compressjs": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/compressjs/-/compressjs-1.0.3.tgz", @@ -5673,11 +5540,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" - }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -5695,6 +5557,7 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5723,10 +5586,60 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==" }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==" + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } }, "debug": { "version": "4.3.3", @@ -5766,8 +5679,7 @@ "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "deepmerge-ts": { "version": "4.2.1", @@ -5823,60 +5735,19 @@ "serialize-javascript": "^6.0.0" } }, - "discord-together": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/discord-together/-/discord-together-1.3.3.tgz", - "integrity": "sha512-K2oKZllYJ8jCCtPzgjn4DtOHho5A3mrXd/ZRmIU4bERFy4TVhT9Zwo+I0JWthGohn2suTDF5GQofn9p27FXKDg==", + "discord-player": { + "version": "5.3.0-dev.3", + "resolved": "https://registry.npmjs.org/discord-player/-/discord-player-5.3.0-dev.3.tgz", + "integrity": "sha512-rrbEBS4mzCyIGk5S9E5O0XWnC4nub2cmBAFr9pZLH7RWBX4+z2nhAt5VwemgenmW/RJy1rseuZZ75WqJDnrHnw==", "requires": { - "discord.js": "^13.1.0", - "node-fetch": "^2.6.1" - }, - "dependencies": { - "@discordjs/builders": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-0.16.0.tgz", - "integrity": "sha512-9/NCiZrLivgRub2/kBc0Vm5pMBE5AUdYbdXsLu/yg9ANgvnaJ0bZKTY8yYnLbsEc/LYUP79lEIdC73qEYhWq7A==", - "requires": { - "@sapphire/shapeshift": "^3.5.1", - "discord-api-types": "^0.36.2", - "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.1", - "tslib": "^2.4.0" - } - }, - "@discordjs/collection": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-0.7.0.tgz", - "integrity": "sha512-R5i8Wb8kIcBAFEPLLf7LVBQKBDYUL+ekb23sOgpkpyGT+V4P7V83wTxcsqmX+PbqHt4cEHn053uMWfRqh/Z/nA==" - }, - "discord-api-types": { - "version": "0.36.3", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.36.3.tgz", - "integrity": "sha512-bz/NDyG0KBo/tY14vSkrwQ/n3HKPf87a0WFW/1M9+tXYK+vp5Z5EksawfCWo2zkAc6o7CClc0eff1Pjrqznlwg==" - }, - "discord.js": { - "version": "13.9.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-13.9.2.tgz", - "integrity": "sha512-wShFlyAyxgQcWzINeufUoT1U0fmju+pPCRzPfJB7CaA0V1tQHc4e0PpO4NQif8sLfZvrQmEILBaIJ0G5I32OxQ==", - "requires": { - "@discordjs/builders": "^0.16.0", - "@discordjs/collection": "^0.7.0", - "@sapphire/async-queue": "^1.3.2", - "@types/node-fetch": "^2.6.2", - "@types/ws": "^8.5.3", - "discord-api-types": "^0.33.3", - "form-data": "^4.0.0", - "node-fetch": "^2.6.7", - "ws": "^8.8.1" - }, - "dependencies": { - "discord-api-types": { - "version": "0.33.5", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.33.5.tgz", - "integrity": "sha512-dvO5M52v7m7Dy96+XUnzXNsQ/0npsYpU6dL205kAtEDueswoz3aU3bh1UMoK4cQmcGtB1YRyLKqp+DXi05lzFg==" - } - } - } + "@discordjs/voice": "^0.11.0", + "libsodium-wrappers": "^0.7.10", + "soundcloud-scraper": "^5.0.3", + "spotify-url-info": "^3.1.2", + "tiny-typed-emitter": "^2.1.0", + "tslib": "^2.4.0", + "youtube-sr": "^4.2.0", + "ytdl-core": "^4.11.0" } }, "discord.js": { @@ -5904,25 +5775,6 @@ } } }, - "discord.js-embed-pagination": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/discord.js-embed-pagination/-/discord.js-embed-pagination-1.0.2.tgz", - "integrity": "sha512-TgGCsJg0G49q9IIMB18AncJ8u0a6TmpFdsA74uMRGEYyt3sa34JBEwxY4KuZK30tQDxPmb3N8GPCoiUg7gpJ+w==" - }, - "distube": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/distube/-/distube-4.0.3.tgz", - "integrity": "sha512-EMR/4d1EgNtNIdTPhwBOtVKqkPX1YJBB4JwPymWIX/i6ip0451X+vZGwJamP2LFh46Usssay0ty+Dm1U0/jQ1g==", - "requires": { - "@distube/ytdl-core": "^4.11.3", - "@distube/ytpl": "^1.1.1", - "@distube/ytsr": "^1.1.8", - "prism-media": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", - "tiny-typed-emitter": "^2.1.0", - "tslib": "^2.4.0", - "undici": "^5.8.0" - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -5947,6 +5799,21 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==" + } + } + }, "domhandler": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", @@ -6042,15 +5909,65 @@ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, - "escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "requires": { + "prelude-ls": "~1.1.2" + } + } + } }, "eslint": { "version": "7.32.0", @@ -6200,8 +6117,7 @@ "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", @@ -6213,22 +6129,6 @@ "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.7.0.tgz", "integrity": "sha1-ywffzUGNoiIdkPd+q3E7wjXiCQ8=" }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, "express": { "version": "4.17.2", "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", @@ -6330,13 +6230,7 @@ "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, "ffmpeg-static": { "version": "4.4.1", @@ -6421,25 +6315,6 @@ "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", "dev": true }, - "fluent-ffmpeg": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/fluent-ffmpeg/-/fluent-ffmpeg-2.1.2.tgz", - "integrity": "sha512-IZTB4kq5GK0DPp7sGQ0q/BWurGHffRtQQwVkiqDgeO6wYJLLV5ZhgNOQ65loZxxuPMKZKZcICCUnaGtlxBiR0Q==", - "requires": { - "async": ">=0.2.9", - "which": "^1.1.1" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "follow-redirects": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", @@ -6463,36 +6338,16 @@ } } }, - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, "form-data-encoder": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.1.tgz", "integrity": "sha512-EFRDrsMm/kyqbTQocNvRXMLjc7Es2Vk+IQFx/YW7hkUH1eBl4J1fqiP34l74Yt0pFLCNpc06fkbVk00008mzjg==" }, - "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, - "fraction.js": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz", - "integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==" - }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -6624,6 +6479,15 @@ "xmlrpc": "^1.3.1" } }, + "genius-lyrics": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/genius-lyrics/-/genius-lyrics-4.3.8.tgz", + "integrity": "sha512-Gy5JrSoWQKAWK54qfmgJFJIgbHDhfq3vXvYRJdh5QpX0DFic+7NxA88HVtkF7NdhCGtCCS2F9YeNGDiXYXMVIw==", + "requires": { + "cheerio": "^1.0.0-rc.9", + "got": "^11.8.2" + } + }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -6668,6 +6532,24 @@ "type-fest": "^0.20.2" } }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, "graceful-readlink": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", @@ -6688,6 +6570,14 @@ "resolved": "https://registry.npmjs.org/himalaya/-/himalaya-1.1.0.tgz", "integrity": "sha512-LLase1dHCRMel68/HZTFft0N0wti0epHr3nNY7ynpLbyZpmrKMQ8YIpiOV77TM97cNpC8Wb2n6f66IRggwdWPw==" }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "htmlparser2": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", @@ -6716,6 +6606,16 @@ "toidentifier": "1.0.1" } }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, "http-response-object": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/http-response-object/-/http-response-object-3.0.2.tgz", @@ -6731,6 +6631,15 @@ } } }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "https-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", @@ -6740,11 +6649,6 @@ "debug": "4" } }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" - }, "i18next": { "version": "20.6.1", "resolved": "https://registry.npmjs.org/i18next/-/i18next-20.6.1.tgz", @@ -6852,10 +6756,10 @@ "is-extglob": "^2.1.1" } }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" }, "isarray": { "version": "1.0.0", @@ -6865,16 +6769,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isomorphic-unfetch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/isomorphic-unfetch/-/isomorphic-unfetch-3.1.0.tgz", - "integrity": "sha512-geDJjpoZ8N0kWexiwkX8F9NkTsXhetLPVbZFQ+JTW239QNOwvB0gniuR1Wc6f0AMTn7/mFGyXvHTifrCp/GH8Q==", - "requires": { - "node-fetch": "^2.6.1", - "unfetch": "^4.2.0" - } + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "jake": { "version": "10.8.2", @@ -6938,11 +6834,6 @@ } } }, - "javascript-natural-sort": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", - "integrity": "sha1-+eIwPUUH9tdDVac2ZNFED7Wg71k=" - }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -6959,6 +6850,86 @@ "esprima": "^4.0.0" } }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "acorn": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", + "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==" + }, + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==" + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "requires": {} + } + } + }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -7020,15 +6991,16 @@ "libsodium": "^0.7.0" } }, - "lodash.deburr": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.deburr/-/lodash.deburr-4.1.0.tgz", - "integrity": "sha1-3bG7s+8HRYwBd7oH3hRCLLAz/5s=" + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "lodash.snakecase": { "version": "4.1.1", @@ -7096,22 +7068,6 @@ "repeat-string": "^1.0.0" } }, - "mathjs": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/mathjs/-/mathjs-9.5.2.tgz", - "integrity": "sha512-c0erTq0GP503/Ch2OtDOAn50GIOsuxTMjmE00NI/vKJFSWrDaQHRjx6ai+16xYv70yBSnnpUgHZGNf9FR9IwmA==", - "requires": { - "@babel/runtime": "^7.15.4", - "complex.js": "^2.0.15", - "decimal.js": "^10.3.1", - "escape-latex": "^1.2.0", - "fraction.js": "^4.1.1", - "javascript-natural-sort": "^0.7.1", - "seedrandom": "^3.0.5", - "tiny-emitter": "^2.1.0", - "typed-function": "^2.0.0" - } - }, "md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -7138,11 +7094,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" - }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", @@ -7166,11 +7117,6 @@ "mime-db": "1.51.0" } }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" - }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -7375,14 +7321,6 @@ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "requires": { - "path-key": "^3.0.0" - } - }, "npmlog": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-5.0.1.tgz", @@ -7402,6 +7340,11 @@ "boolbase": "^1.0.0" } }, + "nwsapi": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.1.tgz", + "integrity": "sha512-JYOWTeFoS0Z93587vRJgASD5Ut11fYl5NyihP3KrYBvMe1FRRs6RN7m20SA/16GM4P6hTnZjT+UmDOt38UeXNg==" + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -7428,14 +7371,6 @@ "wrappy": "1" } }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "requires": { - "mimic-fn": "^2.1.0" - } - }, "optional-require": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz", @@ -7455,6 +7390,11 @@ "word-wrap": "^1.2.3" } }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7495,7 +7435,8 @@ "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true }, "path-to-regexp": { "version": "0.1.7", @@ -7514,8 +7455,9 @@ "dev": true }, "prism-media": { - "version": "https://codeload.github.com/distubejs/prism-media/tar.gz/main#workaround.tar.gz", - "integrity": "sha512-2a/62b86i60OksrnliRwG7IGMHjFHM0KiRYk6YBi43IZpCZCf/ZLjXIbMGtzzeTZhEJy1Fi6Ke6kKtn2ObNjPw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/prism-media/-/prism-media-1.3.4.tgz", + "integrity": "sha512-eW7LXORkTCQznZs+eqe9VjGOrLBxcBPXgNyHXMTSRVhphvd/RrxgIR7WaWt4fkLuhshcdT5KHL88LAfcvS3f5g==", "requires": {} }, "process-nextick-args": { @@ -7537,6 +7479,11 @@ "ipaddr.js": "1.9.1" } }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", @@ -7682,6 +7629,14 @@ "lowercase-keys": "^2.0.0" } }, + "reverbnation-scraper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/reverbnation-scraper/-/reverbnation-scraper-2.0.0.tgz", + "integrity": "sha512-t1Mew5QC9QEVEry5DXyagvci2O+TgXTGoMHbNoW5NRz6LTOzK/DLHUpnrQwloX8CVX5z1a802vwHM3YgUVOvKg==", + "requires": { + "node-fetch": "^2.6.0" + } + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -7714,10 +7669,13 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "seedrandom": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz", - "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==" + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } }, "semver": { "version": "7.3.5", @@ -7797,6 +7755,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -7804,7 +7763,8 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true }, "sift": { "version": "13.5.2", @@ -7862,30 +7822,22 @@ "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" }, - "soundcloud.ts": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/soundcloud.ts/-/soundcloud.ts-0.4.7.tgz", - "integrity": "sha512-NAFdDgo695IEsSE6LbnWbKq8KqNWm/tbmwbybaoHI1tvRKb7s3Zx5kMxd8yEJFy1XUxoAfizoyu3cIyodU4Urg==", + "soundcloud-scraper": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/soundcloud-scraper/-/soundcloud-scraper-5.0.3.tgz", + "integrity": "sha512-AmS9KmK7mMaPVzHzBk40rANpAttZila3+iAet6EA47EeiTBUzVwjq4B+1LCOLtgPmzDSGk0qn+LZOEd5UhnZTQ==", "requires": { - "audioconcat": "^0.1.4", - "axios": "^0.21.1" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - }, - "follow-redirects": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz", - "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==" - } + "cheerio": "^1.0.0-rc.10", + "m3u8stream": "^0.8.4", + "node-fetch": "^2.6.1" } }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, "sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -7909,14 +7861,6 @@ "spotify-uri": "~3.0.1" } }, - "spotify-web-api-node": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/spotify-web-api-node/-/spotify-web-api-node-5.0.2.tgz", - "integrity": "sha512-r82dRWU9PMimHvHEzL0DwEJrzFk+SMCVfq249SLt3I7EFez7R+jeoKQd+M1//QcnjqlXPs2am4DFsGk8/GCsrA==", - "requires": { - "superagent": "^6.1.0" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -7969,11 +7913,6 @@ "ansi-regex": "^5.0.1" } }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" - }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -7989,51 +7928,6 @@ "peek-readable": "^5.0.0-alpha.5" } }, - "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "dependencies": { - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8042,6 +7936,11 @@ "has-flag": "^4.0.0" } }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, "table": { "version": "6.8.0", "resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz", @@ -8094,11 +7993,6 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, "tiny-typed-emitter": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.1.0.tgz", @@ -8118,6 +8012,16 @@ "ieee754": "^1.2.1" } }, + "tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "requires": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + } + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -8162,11 +8066,6 @@ "mime-types": "~2.1.24" } }, - "typed-function": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/typed-function/-/typed-function-2.0.0.tgz", - "integrity": "sha512-Hhy1Iwo/e4AtLZNK10ewVVcP2UEs408DS35ubP825w/YgSBK1KVLwALvvIG4yX75QJrxjCpcWkzkVRB0BwwYlA==" - }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -8185,10 +8084,10 @@ "resolved": "https://registry.npmjs.org/undici/-/undici-5.8.0.tgz", "integrity": "sha512-1F7Vtcez5w/LwH2G2tGnFIihuWUlc58YidwLiCv+jR2Z50x0tNXpRRw7eOIJ+GvqCqIkg9SB7NWAJ/T9TLfv8Q==" }, - "unfetch": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/unfetch/-/unfetch-4.2.0.tgz", - "integrity": "sha512-F9p7yYCn6cIW9El1zi0HI6vqpeIvBsr3dSuRO6Xuppb1u5rXpCPmMvLSyECLhybr9isec8Ohl0hPekMVrEinDA==" + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "unpipe": { "version": "1.0.0", @@ -8230,11 +8129,40 @@ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "requires": { + "xml-name-validator": "^3.0.0" + } + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -8248,6 +8176,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "requires": { "isexe": "^2.0.0" } @@ -8263,8 +8192,7 @@ "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" }, "wrappy": { "version": "1.0.2", @@ -8277,11 +8205,21 @@ "integrity": "sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==", "requires": {} }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, "xmlbuilder": { "version": "8.2.2", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-8.2.2.tgz", "integrity": "sha1-aSSGc0ELS6QuGmE2VR0pIjNap3M=" }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, "xmlrpc": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/xmlrpc/-/xmlrpc-1.3.2.tgz", @@ -8295,6 +8233,21 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "youtube-sr": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/youtube-sr/-/youtube-sr-4.3.0.tgz", + "integrity": "sha512-cRMOeJZi/DYIRqru0R9UsBLwkj4tQvekldnCj4MZOT+ijlfesrllbUDXqKuA2RbYA4ByJlFf9wxZ1ndvuCJ5Ow==" + }, + "ytdl-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/ytdl-core/-/ytdl-core-4.11.0.tgz", + "integrity": "sha512-Q3hCLiUA9AOGQXzPvno14GN+HgF9wsO1ZBHlj0COTcyxjIyFpWvMfii0UC4/cAbVaIjEdbWB71GdcGuc4J1Lmw==", + "requires": { + "m3u8stream": "^0.8.6", + "miniget": "^4.2.2", + "sax": "^1.1.3" + } } } } diff --git a/package.json b/package.json index a992d59b..7e038f4f 100644 --- a/package.json +++ b/package.json @@ -12,41 +12,34 @@ "author": "Jonny_Bro#4226", "license": "ISC", "dependencies": { + "@discord-player/extractor": "^3.0.2", "@discordjs/opus": "^0.8.0", "@discordjs/rest": "^1.0.0", "@discordjs/voice": "^0.11.0", - "@distube/soundcloud": "^1.2.1", - "@distube/spotify": "^1.3.2", - "@distube/yt-dlp": "^1.1.3", - "@distube/ytdl-core": "^4.11.3", - "@sindresorhus/slugify": "^1.1.0", "amethyste-api": "github:Androz2091/amethyste-api", "btoa": "^1.2.1", "canvacord": "^5.1.0", "canvas": "^2.9.0", "chalk": "^4.1.0", - "colors-generator": "^0.3.4", "cron": "^1.7.2", "discord-api-types": "^0.37.0", "discord-giveaways": "^6.0.0", - "discord-together": "^1.3.3", + "discord-player": "^5.3.0-dev.3", "discord.js": "^14.1.2", - "discord.js-embed-pagination": "^1.0.2", - "distube": "^4.0.3", "ejs": "^3.1.3", "express": "^4.17.1", "express-session": "^1.17.0", - "ffmpeg-static": "^4.4.0", + "ffmpeg-static": "^4.4.1", "gamedig": "^4.0.2", "i18next": "^20.2.2", "i18next-node-fs-backend": "^2.1.3", "libsodium-wrappers": "^0.7.10", "markdown-table": "2.0.0", - "mathjs": "^9.0.0", "md5": "^2.2.1", "moment": "^2.26.0", "mongoose": "^5.13.14", - "ms": "^2.1.3" + "ms": "^2.1.3", + "prism-media": "^1.3.4" }, "devDependencies": { "eslint": "^7.5.0" From d11a4a9257582132b8ed92c63cede2cdc6f4ea8b Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Wed, 3 Aug 2022 21:13:22 +0500 Subject: [PATCH 13/16] =?UTF-8?q?=D0=98=D1=89=D1=91=20=3D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/Moderation/setwarns.js | 68 ------------------------ commands/Moderation/warns.js | 27 +++++----- commands/Owner/debug.js | 8 +-- helpers/logger.js | 3 -- languages/ru-RU/misc.json | 2 +- languages/ru-RU/moderation/setwarns.json | 12 ----- languages/ru-RU/moderation/warns.json | 6 +-- languages/ru-RU/owner/debug.json | 2 - languages/uk-UA/moderation/ban.json | 13 ----- languages/uk-UA/moderation/kick.json | 11 ---- languages/uk-UA/moderation/mute.json | 10 ---- languages/uk-UA/moderation/setwarns.json | 12 ----- languages/uk-UA/moderation/unmute.json | 9 ---- 13 files changed, 23 insertions(+), 160 deletions(-) delete mode 100644 TO REWRITE/Moderation/setwarns.js delete mode 100644 languages/ru-RU/moderation/setwarns.json delete mode 100644 languages/uk-UA/moderation/ban.json delete mode 100644 languages/uk-UA/moderation/kick.json delete mode 100644 languages/uk-UA/moderation/mute.json delete mode 100644 languages/uk-UA/moderation/setwarns.json delete mode 100644 languages/uk-UA/moderation/unmute.json diff --git a/TO REWRITE/Moderation/setwarns.js b/TO REWRITE/Moderation/setwarns.js deleted file mode 100644 index 8aebfdee..00000000 --- a/TO REWRITE/Moderation/setwarns.js +++ /dev/null @@ -1,68 +0,0 @@ -const Command = require("../../base/Command"); - -class Setwarns extends Command { - constructor(client) { - super(client, { - name: "setwarns", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setw"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "BAN_MEMBERS", "KICK_MEMBERS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const sanction = args[0]; - if (!sanction || (sanction !== "kick" && sanction !== "ban")) return message.error("moderation/setwarns:MISSING_TYPE"); - - const number = args[1]; - - if (number === "reset") { - if (sanction === "kick") { - data.guild.plugins.warnsSanctions.kick = false; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_KICK_RESET", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } else if (sanction === "ban") { - data.guild.plugins.warnsSanctions.ban = false; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_BAN_RESET", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } - } - - if (!number || isNaN(number)) return message.error("misc:INVALID_NUMBER"); - if (number < 1 || number > 10) return message.error("misc:INVALID_NUMBER_RANGE", 1, 10); - - if (sanction === "kick") { - data.guild.plugins.warnsSanctions.kick = number; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_KICK", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } else if (sanction === "ban") { - data.guild.plugins.warnsSanctions.ban = number; - data.guild.markModified("plugins.warnsSanctions"); - data.guild.save(); - return message.success("moderation/setwarns:SUCCESS_BAN", { - prefix: data.guild.prefix, - count: `${number} ${message.getNoun(number, message.translate("misc:NOUNS:WARNS:1"), message.translate("misc:NOUNS:WARNS:2"), message.translate("misc:NOUNS:WARNS:5"))}` - }); - } - } -} - -module.exports = Setwarns; \ No newline at end of file diff --git a/commands/Moderation/warns.js b/commands/Moderation/warns.js index d6981180..20a68a00 100644 --- a/commands/Moderation/warns.js +++ b/commands/Moderation/warns.js @@ -1,4 +1,4 @@ -const { ApplicationCommandType, PermissionFlagsBits, EmbedBuilder, ContextMenuCommandBuilder } = require("discord.js"); +const { SlashCommandBuilder, PermissionFlagsBits, EmbedBuilder } = require("discord.js"); const BaseCommand = require("../../base/BaseCommand"); class Warns extends BaseCommand { @@ -6,12 +6,15 @@ class Warns extends BaseCommand { * * @param {import("../../base/JaBa")} client */ - constructor() { + constructor(client) { super({ - command: new ContextMenuCommandBuilder() + command: new SlashCommandBuilder() .setName("warns") - .setType(ApplicationCommandType.User) - .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers && PermissionFlagsBits.ManageMessages), + .setDescription(client.translate("moderation/warns:DESCRIPTION")) + .setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers && PermissionFlagsBits.ManageMessages) + .addUserOption(option => option.setName("user") + .setDescription(client.translate("common:USER")) + .setRequired(true)), aliases: [], dirname: __dirname, guildOnly: true @@ -31,8 +34,8 @@ class Warns extends BaseCommand { * @param {Array} data */ async execute(client, interaction) { - const member = interaction.targetMember; - if (member.user.bot) return; + const member = interaction.options.getMember("user"); + if (member.user.bot) return interaction.error("misc:BOT_USER"); const memberData = await client.findOrCreateMember({ id: member.id, @@ -54,19 +57,19 @@ class Warns extends BaseCommand { text: client.config.embed.footer }); - if (memberData.sanctions.length < 1) { - embed.setDescription(interaction.translate("moderation/warns:NO_SANCTION", { + if (memberData.sanctions.length === 0) { + embed.setDescription(interaction.translate("moderation/warns:NO_SANCTIONS", { member: member.nickname || member.user.username })); return interaction.reply({ embeds: [embed] }); } else { - memberData.sanctions.forEach((s) => { + memberData.sanctions.forEach(sanction => { embed.addFields([ { - name: s.type + " | #" + s.case, - value: `${interaction.translate("common:MODERATOR")}: <@${s.moderator}>\n${interaction.translate("common:REASON")}: ${s.reason}`, + name: sanction.type + " | #" + sanction.case, + value: `${interaction.translate("common:MODERATOR")}: <@${sanction.moderator}>\n${interaction.translate("common:REASON")}: ${sanction.reason}`, inline: true } ]); diff --git a/commands/Owner/debug.js b/commands/Owner/debug.js index 21482301..5704340b 100644 --- a/commands/Owner/debug.js +++ b/commands/Owner/debug.js @@ -49,8 +49,8 @@ class Debug extends BaseCommand { { name: client.translate("common:REP"), value: "rep" }, )) .addUserOption(option => - option.setName("target") - .setDescription(client.translate("owner/debug:TARGET")) + option.setName("user") + .setDescription(client.translate("common:USER")) .setRequired(true)) .addIntegerOption(option => option.setName("int") @@ -81,9 +81,9 @@ class Debug extends BaseCommand { if (action === "set") { const type = interaction.options.getString("type"); - const member = interaction.options.getMember("target"); + const member = interaction.options.getMember("user"); const int = interaction.options.getInteger("int"); - if (member.user.bot) return interaction.error("owner/debug:BOT"); + if (member.user.bot) return interaction.error("misc:BOT_USER"); switch (type) { case "level": { diff --git a/helpers/logger.js b/helpers/logger.js index 1844a21a..a9fb810e 100644 --- a/helpers/logger.js +++ b/helpers/logger.js @@ -1,6 +1,3 @@ -/* -Logger class for easy and aesthetically pleasing console logging -*/ const { bgBlue, black, green } = require("chalk"); function dateTimePad(value, digits) { diff --git a/languages/ru-RU/misc.json b/languages/ru-RU/misc.json index cc3a54ce..301b4dff 100644 --- a/languages/ru-RU/misc.json +++ b/languages/ru-RU/misc.json @@ -10,7 +10,7 @@ "INVALID_NUMBER_RANGE": "Укажите число от **{{min}}** до **{{max}}**!", "FORCE_STOP": "Игра принудительно окончена {{user}}, никто не победил!", "STATS_FOOTER": "● [Панель управления]({{dashboardLink}})\n● [Документация]({{docsLink}})\n● [Пригласить JaBa на свой сервер]({{inviteLink}})\n● [Поддержать]({{donateLink}}) (укажите ваш Discord тэг для выдачи ачивки, для других способов поддержки пишите в ЛС <@{{owner}}>)", - "BOT_USER": "Это бот!", + "BOT_USER": "Вы не можете сделать это с ботом!", "NO_PERMS": "Недостаточно прав для выполнения данного действия!", "NO_REASON_PROVIDED": "Причина не указана", "NO_USER_FOUND_ID": "Пользователя с ID `{{id}}` не существует!", diff --git a/languages/ru-RU/moderation/setwarns.json b/languages/ru-RU/moderation/setwarns.json deleted file mode 100644 index 0b8a00cd..00000000 --- a/languages/ru-RU/moderation/setwarns.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "DESCRIPTION": "Настроить наказание которое пользователь будет получать после данного кол-ва предупреждений!", - "USAGE": "setwarns [kick/ban] [число/reset]", - "EXAMPLES": "setwarns kick 5\nsetwarns ban 10\nsetwarns ban reset", - "MISSING_TYPE": "Выберите действие: `kick` или `ban`!", - "SUCCESS_KICK": "`{{count}}` приведут к кику!\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", - "SUCCESS_BAN": "`{{count}}` приведут к бану!\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", - "SUCCESS_KICK_RESET": "**Автокик пользователей отключён!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", - "SUCCESS_BAN_RESET": "**Автобан пользователей отключён!**\n\n:arrow_right_hook: *Используйте `configuration`, чтобы увидеть обновлённые настройки!*", - "AUTO_BAN": "**{{username}}** был автоматически забанен за достижение {{count}}!", - "AUTO_KICK": "**{{username}}** был автоматически кикнут за достижение {{count}}!" -} \ No newline at end of file diff --git a/languages/ru-RU/moderation/warns.json b/languages/ru-RU/moderation/warns.json index 4d7e0c1b..7dd84743 100644 --- a/languages/ru-RU/moderation/warns.json +++ b/languages/ru-RU/moderation/warns.json @@ -1,7 +1,7 @@ { "DESCRIPTION": "Показать список нарушений пользователя!", - "USAGE": "ПКМ на пользователя - Приложения - warns", - "EXAMPLES": "", + "USAGE": "warns [@пользователь]", + "EXAMPLES": "warns @Jonny_Bro#4226", "SANCTIONS_OF": "Нарушения {{member}}", - "NO_SANCTION": "У **{{member}}** нет нарушений." + "NO_SANCTIONS": "У **{{member}}** нет нарушений." } \ No newline at end of file diff --git a/languages/ru-RU/owner/debug.json b/languages/ru-RU/owner/debug.json index 06b88eea..3d19e106 100644 --- a/languages/ru-RU/owner/debug.json +++ b/languages/ru-RU/owner/debug.json @@ -5,9 +5,7 @@ "TYPE": "Тип данных", "SET": "Установить значение", "ADD": "Добавить к значению", - "TARGET": "Пользователь", "INT": "Целое число", - "BOT": "Вы не можете изменить статистику бота!", "SUCCESS_LEVEL": "Уровень пользователя **{{username}}** изменён на **{{amount}}**!", "SUCCESS_XP": "XP пользователя **{{username}}** изменён на **{{amount}}**!", "SUCCESS_CREDITS": "Кредиты пользователя **{{username}}** изменены на **{{amount}}**!", diff --git a/languages/uk-UA/moderation/ban.json b/languages/uk-UA/moderation/ban.json deleted file mode 100644 index 06d7b03d..00000000 --- a/languages/uk-UA/moderation/ban.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "DESCRIPTION": "Забанити користувача на сервері!", - "USAGE": "ban [@користувач] (причина)", - "EXAMPLES": "ban @Jonny_Bro#4226 Спам", - "MISSING_MEMBER": "Ви повинні згадати користувача!", - "YOURSELF": "Ви не можете забанити себе!", - "SUPERIOR": "Ви не можете зробити це, тому що користувач стоїть вище за вас по ролі!", - "ALREADY_BANNED": "**{{username}}** вже в лазні!", - "MISSING_PERM": "Сталася помилка... Перевірте, чи є у вас право банити користувачів і спробуйте знову!", - "BANNED_DM": "Привіт {{username}},\nви були забанені на сервері **{{server}}** користувачем **{{moderator}}** через **{{reason}}**!" , - "BANNED": "**{{username}}** був забанений на сервері **{{server}}** користувачем **{{moderator}}** через **{{reason}}**!" , - "CASE": "Бан | Номер #{{count}}" - } \ No newline at end of file diff --git a/languages/uk-UA/moderation/kick.json b/languages/uk-UA/moderation/kick.json deleted file mode 100644 index 4ab4406e..00000000 --- a/languages/uk-UA/moderation/kick.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "DESCRIPTION": "Кікнути користувача!", - "USAGE": "kick [@користувач] (причина)", - "EXAMPLES": "kick @Jonny_Bro#4226 Спам", - "MISSING_MEMBER": "Ви повинні згадати користувача!", - "YOURSELF": "Ви не можете кікнути себе!", - "MISSING_PERM": "Сталася помилка... Перевірте, чи є у вас право кікати користувачів і спробуйте знову!", - "KICKED_DM": "Привіт {{username}},\nви були кікнуті з сервера **{{server}}** користувачем **{{moderator}}** через **{{reason}}**!" , - "KICKED": "**{{username}}** був кікнутий з сервера **{{server}}** користувачем **{{moderator}}** через **{{reason}}**!" , - "CASE": "Кік | Номер #{{count}}" - } \ No newline at end of file diff --git a/languages/uk-UA/moderation/mute.json b/languages/uk-UA/moderation/mute.json deleted file mode 100644 index b296e8fc..00000000 --- a/languages/uk-UA/moderation/mute.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "DESCRIPTION": "Заборонити користувачеві писати повідомлення та входити в голосові канали!", - "USAGE": "mute [@користувач] [час] (причина)", - "EXAMPLES": "mute @Jonny_Bro#4226 24h Спам", - "MISSING_MEMBER": "Ви повинні згадати користувача!", - "YOURSELF": "Ви не можете замутить себе!", - "MUTED_DM": "Привіт {{username}},\nви були замучені на сервері **{{server}}** користувачем **{{moderator}}** на **{{time}}** через * *{{reason}}**!", - "MUTED": "**{{username}}** замучений на **{{time}}** через **{{reason}}**!", - "CASE": "Мут | Номер #{{count}}" -} \ No newline at end of file diff --git a/languages/uk-UA/moderation/setwarns.json b/languages/uk-UA/moderation/setwarns.json deleted file mode 100644 index 1a393b0a..00000000 --- a/languages/uk-UA/moderation/setwarns.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "DESCRIPTION": "Налаштувати покарання, яке користувач буде отримувати після даної кількості попереджень!", - "USAGE": "setwarns [kick/ban] [число/reset]", - "EXAMPLES": "setwarns kick 5\nsetwarns ban 10\nsetwarns ban reset", - "MISSING_TYPE": "Виберіть дію: `kick` або `ban`!", - "SUCCESS_KICK": "`{{count}}` призведуть до кіку!\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", - "SUCCESS_BAN": "`{{count}}` приведуть до бана!\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", - "SUCCESS_KICK_RESET": "**Автокік користувачів вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", - "SUCCESS_BAN_RESET": "**Автобан користувачів вимкнено!**\n\n:arrow_right_hook: *Використовуйте `configuration`, щоб побачити оновлені налаштування!*", - "AUTO_BAN": "**{{username}}** був автоматично забанений за досягнення {{count}}!", - "AUTO_KICK": "**{{username}}** був автоматично кікнутий за досягнення {{count}}!" - } \ No newline at end of file diff --git a/languages/uk-UA/moderation/unmute.json b/languages/uk-UA/moderation/unmute.json deleted file mode 100644 index 4e735ba6..00000000 --- a/languages/uk-UA/moderation/unmute.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "DESCRIPTION": "Розмутити користувача!", - "USAGE": "unmute [@user]", - "EXAMPLES": "unmute @Jonny_Bro#4226", - "MISSING_MEMBER": "Ви повинні згадати користувача!", - "NOT_MUTED": "**{{username}}** не замучений на даному сервері!", - "SUCCESS": "**{{username}}** був розмучений на даному сервері!", - "SUCCESS_CASE": "{{user}} (`{{usertag}}`) розмучений! (Номер #{{count}})" -} \ No newline at end of file From 5f4c53b072a9e0a01e5f0d923540a80aaef4260b Mon Sep 17 00:00:00 2001 From: JonnyBro Date: Thu, 4 Aug 2022 19:26:17 +0500 Subject: [PATCH 14/16] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D1=81=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=B0=D1=82=D0=B5=D0=B3=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D1=8F=20General=20=D0=A3=D0=B4=D0=B0=D0=BB=D1=91?= =?UTF-8?q?=D0=BD=20=D0=BC=D1=83=D1=81=D0=BE=D1=80=20=D0=B8=20=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=83=D0=B6=D0=BD=D1=8B=D0=B5=20=D0=BA=D0=BE=D0=BC=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TO REWRITE/Administration/autorole.js | 3 +- TO REWRITE/Administration/configuration.js | 4 - TO REWRITE/Administration/goodbye.js | 3 +- TO REWRITE/Administration/setbirthdays.js | 3 +- TO REWRITE/Administration/setmodlogs.js | 3 +- TO REWRITE/Administration/setprefix.js | 33 ---- TO REWRITE/Administration/setreports.js | 3 +- TO REWRITE/Administration/setsuggests.js | 3 +- TO REWRITE/Administration/welcome.js | 3 +- TO REWRITE/General/avatar.js | 36 ----- TO REWRITE/General/emoji.js | 57 ------- TO REWRITE/General/minecraft.js | 105 ------------- TO REWRITE/General/remindme.js | 45 ------ TO REWRITE/General/report.js | 86 ---------- TO REWRITE/General/serverinfo.js | 101 ------------ TO REWRITE/General/setafk.js | 49 ------ TO REWRITE/General/shorturl.js | 42 ----- TO REWRITE/General/staff.js | 50 ------ TO REWRITE/General/stats.js | 90 ----------- TO REWRITE/General/suggest.js | 76 --------- TO REWRITE/General/userinfo.js | 147 ------------------ TO REWRITE/General/whois.js | 73 --------- base/Guild.js | 55 +++---- base/JaBa.js | 32 ++-- base/Member.js | 27 ++-- base/User.js | 26 ++-- commands/General/afk.js | 48 ++++++ commands/General/avatar.js | 49 ++++++ commands/General/emoji.js | 71 +++++++++ commands/General/minecraft.js | 102 ++++++++++++ commands/General/remindme.js | 61 ++++++++ commands/General/report.js | 99 ++++++++++++ commands/General/serverinfo.js | 106 +++++++++++++ commands/General/shorturl.js | 48 ++++++ commands/General/staff.js | 64 ++++++++ commands/General/stats.js | 104 +++++++++++++ commands/General/suggest.js | 88 +++++++++++ commands/General/userinfo.js | 120 ++++++++++++++ commands/General/whois.js | 73 +++++++++ commands/Music/queue.js | 4 +- commands/Owner/announcement.js | 7 +- commands/Owner/debug.js | 80 +++++----- commands/Owner/eval.js | 7 +- commands/Owner/reload.js | 7 +- commands/Owner/say.js | 12 +- dashboard/views/manager/guild.ejs | 8 +- events/MessageHandler.js | 4 +- helpers/resolvers.js | 100 ------------ languages/en-US/common.json | 3 - languages/ru-RU/administration/setprefix.json | 8 - .../ru-RU/administration/stealemoji.json | 1 - languages/ru-RU/common.json | 10 +- languages/ru-RU/dashboard.json | 4 +- .../ru-RU/general/{setafk.json => afk.json} | 7 +- languages/ru-RU/general/minecraft.json | 1 - languages/ru-RU/general/remindme.json | 2 +- languages/ru-RU/general/report.json | 2 - languages/ru-RU/general/serverinfo.json | 5 +- languages/ru-RU/general/shorturl.json | 2 +- languages/ru-RU/general/stats.json | 10 +- languages/ru-RU/general/userinfo.json | 8 +- languages/ru-RU/general/whois.json | 3 +- languages/ru-RU/misc.json | 15 -- languages/ru-RU/owner/say.json | 4 +- languages/uk-UA/administration/setprefix.json | 8 - languages/uk-UA/common.json | 3 - languages/uk-UA/dashboard.json | 4 +- 67 files changed, 1180 insertions(+), 1337 deletions(-) delete mode 100644 TO REWRITE/Administration/setprefix.js delete mode 100644 TO REWRITE/General/avatar.js delete mode 100644 TO REWRITE/General/emoji.js delete mode 100644 TO REWRITE/General/minecraft.js delete mode 100644 TO REWRITE/General/remindme.js delete mode 100644 TO REWRITE/General/report.js delete mode 100644 TO REWRITE/General/serverinfo.js delete mode 100644 TO REWRITE/General/setafk.js delete mode 100644 TO REWRITE/General/shorturl.js delete mode 100644 TO REWRITE/General/staff.js delete mode 100644 TO REWRITE/General/stats.js delete mode 100644 TO REWRITE/General/suggest.js delete mode 100644 TO REWRITE/General/userinfo.js delete mode 100644 TO REWRITE/General/whois.js create mode 100644 commands/General/afk.js create mode 100644 commands/General/avatar.js create mode 100644 commands/General/emoji.js create mode 100644 commands/General/minecraft.js create mode 100644 commands/General/remindme.js create mode 100644 commands/General/report.js create mode 100644 commands/General/serverinfo.js create mode 100644 commands/General/shorturl.js create mode 100644 commands/General/staff.js create mode 100644 commands/General/stats.js create mode 100644 commands/General/suggest.js create mode 100644 commands/General/userinfo.js create mode 100644 commands/General/whois.js delete mode 100644 helpers/resolvers.js delete mode 100644 languages/ru-RU/administration/setprefix.json rename languages/ru-RU/general/{setafk.json => afk.json} (57%) delete mode 100644 languages/uk-UA/administration/setprefix.json diff --git a/TO REWRITE/Administration/autorole.js b/TO REWRITE/Administration/autorole.js index 234d4d42..2945f2bb 100644 --- a/TO REWRITE/Administration/autorole.js +++ b/TO REWRITE/Administration/autorole.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Autorole extends Command { constructor(client) { diff --git a/TO REWRITE/Administration/configuration.js b/TO REWRITE/Administration/configuration.js index 2359a58f..4fa10126 100644 --- a/TO REWRITE/Administration/configuration.js +++ b/TO REWRITE/Administration/configuration.js @@ -31,10 +31,6 @@ class Configuration extends Command { }); embed.addFields([ - { // Guild prefix - name: message.translate("administration/configuration:PREFIX_TITLE"), - value: guildData.prefix - }, { // Ignored channels name: message.translate("administration/configuration:IGNORED_CHANNELS_TITLE"), value: guildData.ignoredChannels.length > 0 ? guildData.ignoredChannels.map((ch) => `<#${ch}>`).join(", ") : message.translate("administration/configuration:NO_IGNORED_CHANNELS") diff --git a/TO REWRITE/Administration/goodbye.js b/TO REWRITE/Administration/goodbye.js index 8a2c1573..75530c8f 100644 --- a/TO REWRITE/Administration/goodbye.js +++ b/TO REWRITE/Administration/goodbye.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Goodbye extends Command { constructor(client) { diff --git a/TO REWRITE/Administration/setbirthdays.js b/TO REWRITE/Administration/setbirthdays.js index 660d9091..f5ace784 100644 --- a/TO REWRITE/Administration/setbirthdays.js +++ b/TO REWRITE/Administration/setbirthdays.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Setbirthdays extends Command { constructor(client) { diff --git a/TO REWRITE/Administration/setmodlogs.js b/TO REWRITE/Administration/setmodlogs.js index 6a5cc145..2fb8b3d6 100644 --- a/TO REWRITE/Administration/setmodlogs.js +++ b/TO REWRITE/Administration/setmodlogs.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Setmodlogs extends Command { constructor(client) { diff --git a/TO REWRITE/Administration/setprefix.js b/TO REWRITE/Administration/setprefix.js deleted file mode 100644 index a680f126..00000000 --- a/TO REWRITE/Administration/setprefix.js +++ /dev/null @@ -1,33 +0,0 @@ -const Command = require("../../base/Command"); - -class Setprefix extends Command { - constructor(client) { - super(client, { - name: "setprefix", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["setp"], - memberPermissions: ["MANAGE_GUILD"], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const prefix = args[0]; - if (!prefix) return message.error("administration/setprefix:MISSING_PREFIX"); - if (prefix.length > 5) return message.error("administration/setprefix:TOO_LONG"); - - data.guild.prefix = prefix; - data.guild.save(); - - return message.success("administration/setprefix:SUCCESS", { - prefix - }); - } -} - -module.exports = Setprefix; \ No newline at end of file diff --git a/TO REWRITE/Administration/setreports.js b/TO REWRITE/Administration/setreports.js index 7e73f550..da955d95 100644 --- a/TO REWRITE/Administration/setreports.js +++ b/TO REWRITE/Administration/setreports.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Setreports extends Command { constructor(client) { diff --git a/TO REWRITE/Administration/setsuggests.js b/TO REWRITE/Administration/setsuggests.js index 5bdf3664..969b0af8 100644 --- a/TO REWRITE/Administration/setsuggests.js +++ b/TO REWRITE/Administration/setsuggests.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Setsuggests extends Command { constructor(client) { diff --git a/TO REWRITE/Administration/welcome.js b/TO REWRITE/Administration/welcome.js index 2e2bd7ad..dde95048 100644 --- a/TO REWRITE/Administration/welcome.js +++ b/TO REWRITE/Administration/welcome.js @@ -1,5 +1,4 @@ -const Command = require("../../base/Command"), - Resolvers = require("../../helpers/resolvers"); +const Command = require("../../base/Command"); class Welcome extends Command { constructor(client) { diff --git a/TO REWRITE/General/avatar.js b/TO REWRITE/General/avatar.js deleted file mode 100644 index ddaefd85..00000000 --- a/TO REWRITE/General/avatar.js +++ /dev/null @@ -1,36 +0,0 @@ -const Command = require("../../base/Command"); - -class Avatar extends Command { - constructor(client) { - super(client, { - name: "avatar", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: [], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS", "ATTACH_FILES"], - nsfw: false, - ownerOnly: false, - cooldown: 3000 - }); - } - - async run(message, args) { - let user = await this.client.resolveUser(args[0]); - if (!user) user = message.author; - const avatarURL = user.displayAvatarURL({ - size: 512 - }); - - if (args[0] === "link") return message.reply({ content: `<${avatarURL}>` }); - - message.reply({ - files: [{ - attachment: avatarURL - }] - }); - } -} - -module.exports = Avatar; \ No newline at end of file diff --git a/TO REWRITE/General/emoji.js b/TO REWRITE/General/emoji.js deleted file mode 100644 index 7d3f9da5..00000000 --- a/TO REWRITE/General/emoji.js +++ /dev/null @@ -1,57 +0,0 @@ -const Command = require("../../base/Command"), - { EmbedBuilder, parseEmoji } = require("discord.js"); - -class EmojiInfo extends Command { - constructor(client) { - super(client, { - name: "emoji", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["emi"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const rawEmoji = args[0]; - if (!rawEmoji) return message.error("administration/stealemoji:MISSING_EMOJI"); - - const parsedEmoji = parseEmoji(rawEmoji); - - const embed = new EmbedBuilder() - .setAuthor({ - name: message.translate("general/emoji:TITLE", { - emoji: parsedEmoji.name - }) - }) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .addFields([ - { - name: message.translate("general/emoji:NAME"), - value: parsedEmoji.name - }, - { - name: message.translate("general/emoji:ANIMATED"), - value: parsedEmoji.animated ? message.translate("common:YES") : message.translate("common:NO") - }, - { - name: message.translate("general/emoji:ID"), - value: parsedEmoji.id ? parsedEmoji.id.toString() : message.translate("general/emoji:STANDART") - } - ]); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = EmojiInfo; \ No newline at end of file diff --git a/TO REWRITE/General/minecraft.js b/TO REWRITE/General/minecraft.js deleted file mode 100644 index 30e44e67..00000000 --- a/TO REWRITE/General/minecraft.js +++ /dev/null @@ -1,105 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - gamedig = require("gamedig"); - -class Minecraft extends Command { - constructor(client) { - super(client, { - name: "minecraft", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["mc"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const ip = args[0]; - if (!ip) return message.error("general/minecraft:MISSING_IP"); - - const favicon = `https://eu.mc-api.net/v3/server/favicon/${ip}`; - let options = { - type: "minecraft", - host: ip - }; - - if (ip.split(":").length > 1) { - const ipp = ip.split(":"); - options = { - type: "minecraft", - host: ipp[0], - port: ipp[1] - }; - } - - const m = await message.sendT("misc:PLEASE_WAIT", null, { - prefixEmoji: "loading" - }); - - let json = null; - - await gamedig.query(options).then((res) => { - json = res; - }).catch((err) => { - console.error(err); - }); - - if (!json) { - options.type = "minecraftpe"; - await gamedig.query(options).then((res) => { - json = res; - }).catch((err) => { - console.error(err); - }); - } - - if (!json) return m.error("general/minecraft:FAILED", null, { edit: true }); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: json.name - }) - .addFields([ - { - name: message.translate("general/minecraft:FIELD_STATUS"), - value: message.translate("general/minecraft:ONLINE") - }, - { - name: message.translate("general/minecraft:FIELD_CONNECTED"), - value: `**${(json.raw.players ? json.raw.players.online : json.players.length)}** ${message.getNoun((json.raw.players ? json.raw.players.online : json.players.length), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))} / **${(json.raw.players ? json.raw.players.max : json.maxplayers)}** ${message.getNoun((json.raw.players ? json.raw.players.max : json.maxplayers), message.translate("misc:NOUNS:PLAYERS:1"), message.translate("misc:NOUNS:PLAYERS:2"), message.translate("misc:NOUNS:PLAYERS:5"))}` - }, - { - name: message.translate("general/minecraft:FIELD_IP"), - value: json.connect, - inline: true - }, - { - name: message.translate("general/minecraft:FIELD_VERSION"), - value: json.raw.vanilla.raw.version.name, - inline: true - - }, - { - name: message.translate("general/minecraft:FIELD_PING"), - value: json.raw.vanilla.ping.toString() - } - ]) - .setColor(data.config.embed.color) - .setThumbnail(favicon) - .setFooter({ - text: data.config.embed.footer - }); - - m.edit({ - content: null, - embeds: [embed] - }); - } -} - -module.exports = Minecraft; \ No newline at end of file diff --git a/TO REWRITE/General/remindme.js b/TO REWRITE/General/remindme.js deleted file mode 100644 index eb5861b6..00000000 --- a/TO REWRITE/General/remindme.js +++ /dev/null @@ -1,45 +0,0 @@ -const Command = require("../../base/Command"), - ms = require("ms"); - -class Remindme extends Command { - constructor(client) { - super(client, { - name: "remindme", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["reminder", "remind", "rem"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const time = args[0]; - if (!time || isNaN(ms(time))) return message.error("misc:INVALID_TIME"); - - const msg = args.slice(1).join(" "); - if (!msg) return message.error("general/remindme:MISSING_MESSAGE"); - - const rData = { - message: msg, - createdAt: Date.now(), - sendAt: Date.now() + ms(time) - }; - - if (!data.userData.reminds) data.userData.reminds = []; - - - data.userData.reminds.push(rData); - data.userData.markModified("reminds"); - data.userData.save(); - this.client.databaseCache.usersReminds.set(message.author.id, data.userData); - - message.success("general/remindme:SAVED"); - } -} - -module.exports = Remindme; \ No newline at end of file diff --git a/TO REWRITE/General/report.js b/TO REWRITE/General/report.js deleted file mode 100644 index ab294c42..00000000 --- a/TO REWRITE/General/report.js +++ /dev/null @@ -1,86 +0,0 @@ -const Command = require("../../base/Command"), - { EmbedBuilder, parseEmoji} = require("discord.js"); - -class Report extends Command { - constructor(client) { - super(client, { - name: "report", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["repo"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (message.author.id === "285109105717280768") return message.reply({ content: "Пошёл нахуй фахон" }); - - const repChannel = message.guild.channels.cache.get(data.guild.plugins.reports); - if (!repChannel) return message.error("general/report:MISSING_CHANNEL"); - - const member = await this.client.resolveMember(args[0], message.guild); - if (!member) return message.error("general/report:MISSING_USER"); - if (member.id === message.author.id) return message.error("general/report:INVALID_USER"); - - const rep = args.slice(1).join(" "); - if (!rep) return message.error("general/report:MISSING_REASON"); - - const embed = new EmbedBuilder() - .setAuthor({ - name: message.translate("general/report:TITLE", { - user: member.user.tag - }), - iconURL: message.author.displayAvatarURL({ - extension: "png", - size: 512 - }) - }) - .addFields([ - { - name: message.translate("common:AUTHOR"), - value: message.author.tag, - inline: true - }, - { - name: message.translate("common:DATE"), - value: this.client.printDate(new Date(Date.now())), - inline: true - }, - { - name: message.translate("common:REASON"), - value: rep, - inline: true - }, - { - name: message.translate("common:USER"), - value: `\`${member.user.tag}\` (${member.user.toString()})`, - inline: true - } - ]) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const success = parseEmoji(this.client.customEmojis.cool).id; - const error = parseEmoji(this.client.customEmojis.notcool).id; - - repChannel.send({ - embeds: [embed] - }).then(async (m) => { - await m.react(success); - await m.react(error); - }); - - message.success("general/report:SUCCESS", { - channel: repChannel.toString() - }); - } -} - -module.exports = Report; \ No newline at end of file diff --git a/TO REWRITE/General/serverinfo.js b/TO REWRITE/General/serverinfo.js deleted file mode 100644 index bb386b0b..00000000 --- a/TO REWRITE/General/serverinfo.js +++ /dev/null @@ -1,101 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Serverinfo extends Command { - constructor(client) { - super(client, { - name: "serverinfo", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["si"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let guild = message.guild; - - if (args[0]) { - let found = this.client.guilds.cache.get(args[0]); - if (!found) { - found = this.client.guilds.cache.find(g => g.name.includes(args.join(" ")) || g.id === args[0]); - if (found) guild = found; - } - } - - await guild.members.fetch(); - const owner = await guild.fetchOwner(); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: guild.name, - iconURL: guild.iconURL() - }) - .setThumbnail(guild.iconURL()) - .addFields([ - { - name: this.client.customEmojis.link + " " + message.translate("general/serverinfo:LINK"), - value: `[${message.translate("general/serverinfo:LINK_TEXT")}](${this.client.config.dashboard.baseURL}/stats/${guild.id})` - }, - { - name: this.client.customEmojis.title + message.translate("common:NAME"), - value: guild.name, - inline: true - }, - { - name: this.client.customEmojis.calendar + message.translate("common:CREATION"), - value: this.client.printDate(guild.createdAt), - inline: true - }, - { - name: this.client.customEmojis.users + message.translate("common:MEMBERS"), - value: `${guild.members.cache.filter(m => !m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => !m.user.bot).size, message.translate("misc:NOUNS:MEMBERS:1"), message.translate("misc:NOUNS:MEMBERS:2"), message.translate("misc:NOUNS:MEMBERS:5"))}` + - "\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${message.getNoun(guild.members.cache.filter(m => m.user.bot).size, message.translate("misc:NOUNS:BOTS:1"), message.translate("misc:NOUNS:BOTS:2"), message.translate("misc:NOUNS:BOTS:5"))}`, - inline: true - }, - { - name: this.client.customEmojis.afk + message.translate("general/serverinfo:AFK_CHANNEL"), - value: guild.afkChannel ? guild.afkChannel.toString() : message.translate("general/serverinfo:NO_AFK_CHANNEL"), - inline: true - }, - { - name: this.client.customEmojis.id + message.translate("common:ID"), - value: guild.id, - inline: true - }, - { - name: this.client.customEmojis.crown + message.translate("common:OWNER"), - value: owner.toString(), - inline: true - }, - { - name: this.client.customEmojis.boost + message.translate("general/serverinfo:BOOSTS"), - value: guild.premiumSubscriptionCount.toString() || "0", - inline: true - }, - { - name: this.client.customEmojis.channels + message.translate("common:CHANNELS"), - value: `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, message.translate("misc:NOUNS:TEXT:1"), message.translate("misc:NOUNS:TEXT:2"), message.translate("misc:NOUNS:TEXT:5"))}` + - "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, message.translate("misc:NOUNS:VOICE:1"), message.translate("misc:NOUNS:VOICE:2"), message.translate("misc:NOUNS:VOICE:5"))}` + - "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${message.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, message.translate("misc:NOUNS:CATEGORY:1"), message.translate("misc:NOUNS:CATEGORY:2"), message.translate("misc:NOUNS:CATEGORY:5"))}`, - inline: true - } - ]) - - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Serverinfo; \ No newline at end of file diff --git a/TO REWRITE/General/setafk.js b/TO REWRITE/General/setafk.js deleted file mode 100644 index 2d54f2b4..00000000 --- a/TO REWRITE/General/setafk.js +++ /dev/null @@ -1,49 +0,0 @@ -const Command = require("../../base/Command"); - -class Setafk extends Command { - constructor(client) { - super(client, { - name: "setafk", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["afk"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - const reason = args.join(" "); - if (!reason || reason.length > 250) return message.error("general/setafk:MISSING_REASON"); - - if (reason === "delete") { - if (data.userData.afk) { - data.userData.afk = null; - data.userData.save(); - - return message.sendT("general/setafk:DELETED", { - username: message.author.username - }); - } - } else { - data.userData.afk = reason; - data.userData.save(); - - const m = await message.success("general/setafk:SUCCESS", { - reason, - prefix: message.guild ? data.guild.prefix : "" - }); - - setTimeout(() => { - if (m.deletable) m.delete(); - if (message.deletable) message.delete(); - }, 10 * 1000); - } - } -} - -module.exports = Setafk; \ No newline at end of file diff --git a/TO REWRITE/General/shorturl.js b/TO REWRITE/General/shorturl.js deleted file mode 100644 index df49351d..00000000 --- a/TO REWRITE/General/shorturl.js +++ /dev/null @@ -1,42 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class ShortURL extends Command { - constructor(client) { - super(client, { - name: "shorturl", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["minimize"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const url = args[0]; - if (!url) return message.error("general/shorturl:MISSING_URL"); - - const res = await fetch(`https://is.gd/create.php?format=simple&url=${encodeURI(url)}`); - const body = await res.text(); - - if (body === "Error: Please enter a valid URL to shorten") return message.error("general/shorturl:MISSING_URL"); - - const embed = new Discord.EmbedBuilder() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setDescription(body); - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = ShortURL; \ No newline at end of file diff --git a/TO REWRITE/General/staff.js b/TO REWRITE/General/staff.js deleted file mode 100644 index 61e45dd5..00000000 --- a/TO REWRITE/General/staff.js +++ /dev/null @@ -1,50 +0,0 @@ -const Command = require("../../base/Command"), - { PermissionsBitField, EmbedBuilder } = require("discord.js"); - -class Staff extends Command { - constructor(client) { - super(client, { - name: "staff", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["staf"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - await message.guild.members.fetch(); - const administrators = message.guild.members.cache.filter((m) => m.permissions.has(PermissionsBitField.Flags.Administrator) && !m.user.bot); - const moderators = message.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(PermissionsBitField.Flags.ManageMessages) && !m.user.bot); - const embed = new EmbedBuilder() - .setAuthor({ - name: message.translate("general/staff:TITLE", { - guild: message.guild.name - }) - }) - .addFields([ - { - name: message.translate("general/staff:ADMINS"), - value: (administrators.size > 0 ? administrators.map((a) => `${a.presence ? this.client.customEmojis.status[a.presence.status] : this.client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : message.translate("general/staff:NO_ADMINS")) - }, - { - name: message.translate("general/staff:MODS"), - value: (moderators.size > 0 ? moderators.map((m) => `${m.presence ? this.client.customEmojis.status[m.presence.status] : this.client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : message.translate("general/staff:NO_MODS")) - } - ]) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Staff; \ No newline at end of file diff --git a/TO REWRITE/General/stats.js b/TO REWRITE/General/stats.js deleted file mode 100644 index f2b96444..00000000 --- a/TO REWRITE/General/stats.js +++ /dev/null @@ -1,90 +0,0 @@ -const Command = require("../../base/Command"), - { PermissionsBitField, EmbedBuilder, version } = require("discord.js"); - -class Stats extends Command { - constructor(client) { - super(client, { - name: "stats", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["stat"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - const hiddenGuild = await this.client.guilds.fetch("568120814776614924"); - const users = this.client.users.cache.size - hiddenGuild.memberCount; - const servers = this.client.guilds.cache.size - 1; - - const statsEmbed = new EmbedBuilder() - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setAuthor({ - name: message.translate("common:STATS") - }) - .setDescription(message.translate("general/stats:MADE")) - .addFields([ - { - name: this.client.customEmojis.stats + " " + message.translate("general/stats:COUNTS_TITLE"), - value: message.translate("general/stats:COUNTS_CONTENT", { - servers: servers, - users: users - }), - inline: true - }, - { - name: this.client.customEmojis.version + " " + message.translate("general/stats:VERSIONS_TITLE"), - value: `\`Discord.js: v${version}\`\n\`Nodejs: v${process.versions.node}\``, - inline: true - }, - { - name: this.client.customEmojis.ram + " " + message.translate("general/stats:RAM_TITLE"), - value: `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, - inline: true - }, - { - name: this.client.customEmojis.status.online + " " + message.translate("general/stats:ONLINE_TITLE"), - value: message.translate("general/stats:ONLINE_CONTENT", { - time: this.client.convertTime(Date.now() + this.client.uptime, true, true) - }) - }, - { - name: this.client.customEmojis.voice + " " + message.translate("general/stats:MUSIC_TITLE"), - value: message.translate("general/stats:MUSIC_CONTENT", { - count: `${this.client.player.voices.collection.size} ${message.getNoun(this.client.player.voices.collection.size, message.translate("misc:NOUNS:SERVERS:1"), message.translate("misc:NOUNS:SERVERS:2"), message.translate("misc:NOUNS:SERVERS:5"))}` - }) - }, - { - name: message.translate("general/stats:CREDITS_TITLE"), - value: message.translate("general/stats:CREDITS_CONTENT", { - donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"), - translators: ["**`Jonny_Bro#4226`** - :flag_ru:", "**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua: (НЕ ОБНОВЛЕН!)"].join("\n") - }) - }, - { - name: this.client.customEmojis.link + " " + message.translate("general/stats:LINKS_TITLE"), - value: message.translate("misc:STATS_FOOTER", { - dashboardLink: this.client.config.dashboard.baseURL, - docsLink: `${this.client.config.dashboard.baseURL}/docs/`, - inviteLink: this.client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator ] }), - donateLink: "https://qiwi.com/n/JONNYBRO/", - owner: data.config.owner.id - }) - } - ]); - - message.reply({ - embeds: [statsEmbed] - }); - } -} - -module.exports = Stats; \ No newline at end of file diff --git a/TO REWRITE/General/suggest.js b/TO REWRITE/General/suggest.js deleted file mode 100644 index e5f798d0..00000000 --- a/TO REWRITE/General/suggest.js +++ /dev/null @@ -1,76 +0,0 @@ -const Command = require("../../base/Command"), - { EmbedBuilder, parseEmoji } = require("discord.js"); - -class Suggest extends Command { - constructor(client) { - super(client, { - name: "suggest", - dirname: __dirname, - enabled: true, - guildOnly: true, - aliases: ["sugg"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 2000 - }); - } - - async run(message, args, data) { - if (message.author.id === "285109105717280768") return message.reply({ content: "Пошёл нахуй фахон" }); - - const suggChannel = message.guild.channels.cache.get(data.guild.plugins.suggestions); - if (!suggChannel) return message.error("general/suggest:MISSING_CHANNEL"); - - const sugg = args.join(" "); - if (!sugg) return message.error("general/suggest:MISSING_CONTENT"); - - const embed = new EmbedBuilder() - .setAuthor({ - name: message.translate("general/suggest:TITLE", { - user: message.author.username - }), - iconURL: message.author.displayAvatarURL({ - extension: "png", - size: 512, - }) - }) - .addFields([ - { - name: message.translate("common:AUTHOR"), - value: `\`${message.author.username}#${message.author.discriminator}\``, - inline: true - }, - { - name: message.translate("common:DATE"), - value: this.client.printDate(new Date(Date.now())), - inline: true - }, - { - name: message.translate("common:CONTENT"), - value: sugg - } - ]) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - const success = parseEmoji(this.client.customEmojis.cool).id; - const error = parseEmoji(this.client.customEmojis.notcool).id; - - suggChannel.send({ - embeds: [embed] - }).then(async (m) => { - await m.react(success); - await m.react(error); - }); - - message.success("general/suggest:SUCCESS", { - channel: suggChannel.toString() - }); - } -} - -module.exports = Suggest; \ No newline at end of file diff --git a/TO REWRITE/General/userinfo.js b/TO REWRITE/General/userinfo.js deleted file mode 100644 index d7950f7e..00000000 --- a/TO REWRITE/General/userinfo.js +++ /dev/null @@ -1,147 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"); - -class Userinfo extends Command { - constructor(client) { - super(client, { - name: "userinfo", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ui"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - let displayPresence = true; - - const isID = !isNaN(args[0]); - - let user; - if (!args[0]) user = message.author; - if (message.mentions.users.first()) user = message.mentions.users.first(); - - if (isID && !user) { - user = this.client.users.cache.get(args[0]); - if (!user) { - user = await this.client.users.fetch(args[0], true).catch(() => {}); - displayPresence = false; - } - } - - if (!user) return message.error("general/userinfo:INVALID_USER"); - - let member = null; - if (message.guild) member = await message.guild.members.fetch(user).catch(() => {}); - - const embed = new Discord.EmbedBuilder() - .setAuthor({ - name: `${user.tag} (${user.id})`, - iconURL: user.displayAvatarURL({ - extension: "png", - size: 512 - }) - }) - .setThumbnail(user.displayAvatarURL()) - .addFields([ - { - name: ":man: " + message.translate("common:USERNAME"), - value: member.nickname || user.username, - inline: true - }, - { - name: this.client.customEmojis.discriminator + " " + message.translate("common:DISCRIMINATOR"), - value: user.discriminator, - inline: true - }, - { - name: this.client.customEmojis.bot + " " + message.translate("common:ROBOT"), - value: (user.bot ? message.translate("common:YES") : message.translate("common:NO")), - inlinee: true - }, - { - name: this.client.customEmojis.calendar + " " + message.translate("common:CREATION"), - value: this.client.printDate(user.createdAt), - inline: true - }, - { - name: this.client.customEmojis.avatar + " " + message.translate("common:AVATAR"), - value: member.displayAvatarURL({ - extension: "png", - size: 512 - }) - } - ]) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }); - - if (displayPresence) { - if (member.presence.activities[0].name === "Custom Status") { - embed.addFields([ - { - name: this.client.customEmojis.games + " " + message.translate("common:GAME"), - value: (member.presence.activities[0] ? `Пользовательский статус\n${member.presence.activities[0].state || message.translate("common:NOT_DEFINED")}` : message.translate("general/userinfo:NO_GAME")), - inline: true - }, - { - name: this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), - value: message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), - inline: true - } - ]); - } else { - embed.addFields([ - { - name: this.client.customEmojis.games + " " + message.translate("common:GAME"), - value: (member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : message.translate("general/userinfo:NO_GAME")), - inline: true - }, - { - name: this.client.customEmojis.status[member.presence.status] + " " + message.translate("common:STATUS"), - value: message.translate("common:STATUS_" + (member.presence.status.toUpperCase())), - inline: true - } - ]); - } - } - - if (member) { - embed.addFields([ - { - name: this.client.customEmojis.calendar2 + " " + message.translate("common:JOIN"), - value: this.client.printDate(member.joinedAt), - inline: true - }, - { - name: this.client.customEmojis.color + " " + message.translate("common:COLOR"), - value: member.displayHexColor, - inline: true - }, - { - name: this.client.customEmojis.pencil + " " + message.translate("common:NICKNAME"), - value: (member.nickname ? member.nickname : message.translate("general/userinfo:NO_NICKNAME")), - inline: true - }, - { - name: this.client.customEmojis.roles + " " + message.translate("common:ROLES"), - value: (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 9).join(", ") + " " + message.translate("general/userinfo:MORE_ROLES", { - count: member.roles.cache.size - 10 - }) : (member.roles.cache.size < 1) ? message.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", ")) - } - ]); - } - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Userinfo; \ No newline at end of file diff --git a/TO REWRITE/General/whois.js b/TO REWRITE/General/whois.js deleted file mode 100644 index adbb996f..00000000 --- a/TO REWRITE/General/whois.js +++ /dev/null @@ -1,73 +0,0 @@ -const Command = require("../../base/Command"), - Discord = require("discord.js"), - fetch = require("node-fetch"); - -class Whois extends Command { - constructor(client) { - super(client, { - name: "whois", - dirname: __dirname, - enabled: true, - guildOnly: false, - aliases: ["ip"], - memberPermissions: [], - botPermissions: ["SEND_MESSAGES", "EMBED_LINKS"], - nsfw: false, - ownerOnly: false, - cooldown: 1000 - }); - } - - async run(message, args, data) { - if (!args[0]) return message.error("general/whois:NO_IP"); - - const whois = await fetch(`http://ip-api.com/json/${args[0]}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json()); - - if (whois.status === "fail") { - const embed = new Discord.EmbedBuilder() - .setDescription(whois.message) - .setTitle(message.translate("general/whois:ERROR", { - ip: args[0] - })) - .setColor(data.config.embed.color) - .setFooter({ - text: data.config.embed.footer - }) - .setTimestamp(); - return message.reply({ - embeds: [embed] - }); - } - - const embed = new Discord.EmbedBuilder() - .setTitle(message.translate("general/whois:INFO_ABOUT", { - ip: args[0] - })) - .setFooter({ - text: data.config.embed.footer - }) - .setColor(data.config.embed.color) - .addFields( - { name: "IP", value: whois.query, inline: true }, - { name: message.translate("general/whois:COUNTRY"), value: `${whois.country || message.translate("common:UNKNOWN")} (${whois.countryCode || message.translate("common:UNKNOWN")})`, inline: true }, - { name: message.translate("general/whois:REGION"), value: `${whois.regionName || message.translate("common:UNKNOWN")} (${whois.region || message.translate("common:UNKNOWN")})`, inline: true }, - { name: message.translate("general/whois:CITY"), value: `${whois.city || message.translate("common:UNKNOWN")}`, inline: true }, - { name: message.translate("general/whois:ZIP"), value: `${whois.zip || message.translate("common:UNKNOWN")}`, inline: true }, - { name: message.translate("general/whois:TIMEZONE"), value: `${whois.timezone || message.translate("common:UNKNOWN")}`, inline: true }, - { name: message.translate("general/whois:CONTINENT"), value: `${whois.continent || message.translate("common:UNKNOWN")} (${whois.continentCode || message.translate("common:UNKNOWN")})`, inline: true }, - { name: message.translate("general/whois:CURRENCY"), value: `${whois.currency || message.translate("common:UNKNOWN")}`, inline: true }, - { name: message.translate("general/whois:ISP"), value: `${whois.isp || message.translate("common:UNKNOWN")}`, inline: true } - ) - .setTimestamp(); - - if (whois.proxy == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:PROXY") }); - else if (whois.mobile == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:MOBILE") }); - else if (whois.hosting == true) embed.addFields({ name: message.translate("general/whois:INFO"), value: message.translate("general/whois:HOSTING") }); - - message.reply({ - embeds: [embed] - }); - } -} - -module.exports = Whois; \ No newline at end of file diff --git a/base/Guild.js b/base/Guild.js index a196cd26..c39bdc2a 100644 --- a/base/Guild.js +++ b/base/Guild.js @@ -3,51 +3,42 @@ const mongoose = require("mongoose"), languages = require("../languages/language-meta.json"); module.exports = mongoose.model("Guild", new Schema({ - /* REQUIRED */ - id: { type: String }, // Discord ID of the guild + id: { type: String }, - /* MEMBERSDATA */ - membersData: { type: Object, default: {} }, // Members data of the guild + membersData: { type: Object, default: {} }, members: [{ type: Schema.Types.ObjectId, ref: "Member" }], - /* CONFIGURATION */ - language: { type: String, default: languages.find((l) => l.default).name }, // Language of the guild - plugins: { type: Object, default: { // Plugins data - // Welcome messages + language: { type: String, default: languages.find((l) => l.default).name }, + plugins: { type: Object, default: { welcome: { - enabled: false, // Whether the welcome messages are enabled - message: null, // The welcome message - channel: null, // The channel to send the welcome messages - withImage: null // Whether the welcome images are enabled + enabled: false, + message: null, + channel: null, + withImage: null }, - // Goodbye messages goodbye: { - enabled: false, // Whether the goodbye messages are enabled - message: null, // The goodbye message - channel: null, // The channel to send the goodbye messages - withImage: null // Whether the goodbye images are enabled + enabled: false, + message: null, + channel: null, + withImage: null }, - // Autorole autorole: { - enabled: false, // Whether the autorole is enabled - role: null // The role to add when a member join the server + enabled: false, + role: null }, - // Auto moderation automod: { - enabled: false, // Whether the auto moderation is enabled - ignored: [] // The channels in which the auto moderation is disabled + enabled: false, + ignored: [] }, - // Auto sanctions warnsSanctions: { - kick: false, // The number of warns required to kick the user - ban: false // The number of warns required to ban the user + kick: false, + ban: false }, - suggestions: false, // the channel in which the suggestions will be sent - modlogs: false, // the channel in which the moderation logs (mute, kick, ban, etc...) will be sent - birthdays: false, // the channel in which birtdays announcements will be sent - reports: false, // the channel in which the reports will be sent - logs: false // the channel in which the logs (message deleted, etc...) will be sent + suggestions: false, + modlogs: false, + birthdays: false, + reports: false }}, casesCount: { type: Number, default: 0 }, - autoDeleteModCommands: { type: Boolean, default: false }, // Whether to auto delete moderation commands + autoDeleteModCommands: { type: Boolean, default: false }, })); \ No newline at end of file diff --git a/base/JaBa.js b/base/JaBa.js index c7c084a9..ad5f9afc 100644 --- a/base/JaBa.js +++ b/base/JaBa.js @@ -1,8 +1,5 @@ -const {/* EmbedBuilder, */Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder } = require("discord.js"), +const { Client, Collection, SlashCommandBuilder, ContextMenuCommandBuilder } = require("discord.js"), { GiveawaysManager } = require("discord-giveaways"), - // { SoundCloudPlugin } = require("@distube/soundcloud"), - // { SpotifyPlugin } = require("@distube/spotify"), - // { YtDlpPlugin } = require("@distube/yt-dlp"), { Player } = require("discord-player"), { REST } = require("@discordjs/rest"), { Routes } = require("discord-api-types/v10"); @@ -14,11 +11,10 @@ const BaseEvent = require("./BaseEvent.js"), path = require("path"), fs = require("fs").promises, mongoose = require("mongoose"), - // DisTube = require("distube"), moment = require("moment"); -moment.relativeTimeThreshold("s", 60); moment.relativeTimeThreshold("ss", 5); +moment.relativeTimeThreshold("s", 60); moment.relativeTimeThreshold("m", 60); moment.relativeTimeThreshold("h", 60); moment.relativeTimeThreshold("d", 24); @@ -28,18 +24,18 @@ moment.relativeTimeThreshold("M", 12); class JaBa extends Client { constructor(options) { super(options); - this.config = require("../config"); // Load the config file - this.customEmojis = require("../emojis"); // load the bot's emojis - this.languages = require("../languages/language-meta"); // Load the bot's languages - this.commands = new Collection(); // Creates new commands collection - this.logger = require("../helpers/logger"); // Load the logger file - this.wait = require("node:timers/promises").setTimeout; // client.wait(1000) - Wait 1 second - this.functions = require("../helpers/functions"); // Load the functions file - this.guildsData = require("../base/Guild"); // Guild mongoose model - this.usersData = require("../base/User"); // User mongoose model - this.membersData = require("../base/Member"); // Member mongoose model - this.dashboard = require("../dashboard/app"); // Dashboard app - this.states = {}; // Used for the dashboard + this.config = require("../config"); + this.customEmojis = require("../emojis"); + this.languages = require("../languages/language-meta"); + this.commands = new Collection(); + this.logger = require("../helpers/logger"); + this.wait = require("node:timers/promises").setTimeout; + this.functions = require("../helpers/functions"); + this.guildsData = require("../base/Guild"); + this.usersData = require("../base/User"); + this.membersData = require("../base/Member"); + this.dashboard = require("../dashboard/app"); + this.states = {}; this.knownGuilds = []; this.databaseCache = {}; diff --git a/base/Member.js b/base/Member.js index f00d73ad..9a010c58 100644 --- a/base/Member.js +++ b/base/Member.js @@ -1,30 +1,25 @@ const mongoose = require("mongoose"); module.exports = mongoose.model("Member", new mongoose.Schema({ - /* REQUIRED */ - id: { type: String }, // Discord ID of the user - guildID: { type: String }, // ID of the guild to which the member is connected + id: { type: String }, + guildID: { type: String }, - /* SERVER ECONOMY */ - money: { type: Number, default: 0 }, // Money of the user - workStreak: { type: Number, default: 0 }, // work streak of the user - bankSold: { type: Number, default: 0 }, // Bank sold of the user - exp: { type: Number, default: 0 }, // Exp points of the user - level: { type: Number, default: 0 }, // Level of the user - transactions: { type: Array, default: [] }, // Transactions of the user + money: { type: Number, default: 0 }, + workStreak: { type: Number, default: 0 }, + bankSold: { type: Number, default: 0 }, + exp: { type: Number, default: 0 }, + level: { type: Number, default: 0 }, + transactions: { type: Array, default: [] }, - /* STATS */ - registeredAt: { type: Number, default: Date.now() }, // Registered date of the member + registeredAt: { type: Number, default: Date.now() }, - /* COOLDOWN */ cooldowns: { type: Object, default: { work: 0, rob: 0 }}, - /* OTHER INFORMATIONS */ - sanctions: { type: Array, default: [] }, // Array of the member sanctions (mute, ban, kick, etc...) - mute: { type: Object, default: { // The member mute infos + sanctions: { type: Array, default: [] }, + mute: { type: Object, default: { muted: false, case: null, endDate: null diff --git a/base/User.js b/base/User.js index d7cf0758..c6ffd02c 100644 --- a/base/User.js +++ b/base/User.js @@ -11,19 +11,15 @@ const genToken = () => { }; const userSchema = new mongoose.Schema({ - /* REQUIRED */ - id: { type: String }, // Discord ID of the user + id: { type: String }, - /* ECONOMY (GLOBAL) */ - rep: { type: Number, default: 0 }, // Reputation points of the user - bio: { type: String }, // Biography of the user - birthdate: { type: Number }, // Birthdate of the user (the timestamp) - lover: { type: String }, // The person with whom the user is in a relationship + rep: { type: Number, default: 0 }, + bio: { type: String }, + birthdate: { type: Number }, + lover: { type: String }, - /* STATS */ - registeredAt: { type: Number, default: Date.now() }, // Registered date of the user + registeredAt: { type: Number, default: Date.now() }, - /* ACHIEVEMENTS */ achievements: { type: Object, default: { married: { achieved: false, @@ -76,16 +72,14 @@ const userSchema = new mongoose.Schema({ } }}, - /* COOLDOWN */ cooldowns: { type: Object, default: { rep: 0 }}, - /* OTHER INFORMATIONS */ - afk: { type: String, default: null }, // The AFK reason (if any) - reminds: { type: Array, default: [] }, // The reminds of the user - logged: { type: Boolean, default: false }, // If the user is logged to the dashboard - apiToken: { type: String, default: genToken() } // The API token of the user + afk: { type: String, default: null }, + reminds: { type: Array, default: [] }, + logged: { type: Boolean, default: false }, + apiToken: { type: String, default: genToken() } }); userSchema.method("getAchievements", async function() { diff --git a/commands/General/afk.js b/commands/General/afk.js new file mode 100644 index 00000000..017fb03b --- /dev/null +++ b/commands/General/afk.js @@ -0,0 +1,48 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Afk extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("afk") + .setDescription(client.translate("general/afk:DESCRIPTION")) + .addStringOption(option => option.setName("message") + .setDescription(client.translate("common:MESSAGE")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction, data) { + const reason = interaction.options.getString("message"); + + data.userData.afk = reason; + data.userData.save(); + + interaction.success("general/afk:SUCCESS", { + reason + }, { ephemeral: true }); + } +} + +module.exports = Afk; \ No newline at end of file diff --git a/commands/General/avatar.js b/commands/General/avatar.js new file mode 100644 index 00000000..8f86ccb1 --- /dev/null +++ b/commands/General/avatar.js @@ -0,0 +1,49 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Avatar extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("avatar") + .setDescription(client.translate("general/avatar:DESCRIPTION")) + .addUserOption(option => option.setName("user") + .setDescription(client.translate("common:USER"))), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const user = interaction.options.getUser("user") || interaction.user; + const avatarURL = user.displayAvatarURL({ + size: 512 + }); + + interaction.reply({ + files: [{ + attachment: avatarURL + }] + }); + } +} + +module.exports = Avatar; \ No newline at end of file diff --git a/commands/General/emoji.js b/commands/General/emoji.js new file mode 100644 index 00000000..28c6a98b --- /dev/null +++ b/commands/General/emoji.js @@ -0,0 +1,71 @@ +const { SlashCommandBuilder, EmbedBuilder, parseEmoji } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Emoji extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("emoji") + .setDescription(client.translate("general/emoji:DESCRIPTION")) + .addStringOption(option => option.setName("emoji") + .setDescription(client.translate("common:EMOJI")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const rawEmoji = interaction.options.getString("emoji"); + const parsedEmoji = parseEmoji(rawEmoji); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("general/emoji:TITLE", { + emoji: parsedEmoji.name + }) + }) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }) + .addFields([ + { + name: interaction.translate("general/emoji:NAME"), + value: parsedEmoji.name + }, + { + name: interaction.translate("general/emoji:ANIMATED"), + value: parsedEmoji.animated ? interaction.translate("common:YES") : interaction.translate("common:NO") + }, + { + name: interaction.translate("general/emoji:ID"), + value: parsedEmoji.id?.toString() || interaction.translate("general/emoji:STANDART") + } + ]); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Emoji; \ No newline at end of file diff --git a/commands/General/minecraft.js b/commands/General/minecraft.js new file mode 100644 index 00000000..95666476 --- /dev/null +++ b/commands/General/minecraft.js @@ -0,0 +1,102 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + gamedig = require("gamedig"); + +class Minecraft extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("minecraft") + .setDescription(client.translate("general/minecraft:DESCRIPTION")) + .addStringOption(option => option.setName("ip") + .setDescription(client.translate("common:IP")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + await interaction.deferReply(); + const ip = interaction.options.getString("ip"); + + const options = { + type: "minecraft", + host: ip + }; + + if (ip.split(":").length > 1) { + const splitIp = ip.split(":"); + options.host = splitIp[0]; + options.port = splitIp[1]; + } + + var res = await gamedig.query(options).catch(() => {}); + + if (!res) { + options.type = "minecraftpe"; + res = await gamedig.query(options).catch(() => {}); + } + + if (!res) return interaction.error("general/minecraft:FAILED", null, { edit: true }); + + const embed = new EmbedBuilder() + .setAuthor({ + name: res.name + }) + .addFields([ + { + name: interaction.translate("general/minecraft:FIELD_STATUS"), + value: interaction.translate("general/minecraft:ONLINE") + }, + { + name: interaction.translate("general/minecraft:FIELD_CONNECTED"), + value: `**${(res.raw.players ? res.raw.players.online : res.players.length)}** ${client.getNoun((res.raw.players ? res.raw.players.online : res.players.length), interaction.translate("misc:NOUNS:PLAYERS:1"), interaction.translate("misc:NOUNS:PLAYERS:2"), interaction.translate("misc:NOUNS:PLAYERS:5"))} / **${(res.raw.players ? res.raw.players.max : res.maxplayers)}** ${client.getNoun((res.raw.players ? res.raw.players.max : res.maxplayers), interaction.translate("misc:NOUNS:PLAYERS:1"), interaction.translate("misc:NOUNS:PLAYERS:2"), interaction.translate("misc:NOUNS:PLAYERS:5"))}` + }, + { + name: interaction.translate("general/minecraft:FIELD_IP"), + value: res.connect, + inline: true + }, + { + name: interaction.translate("general/minecraft:FIELD_VERSION"), + value: res.raw.vanilla.raw.version.name, + inline: true + + }, + { + name: interaction.translate("general/minecraft:FIELD_PING"), + value: res.raw.vanilla.ping.toString() + } + ]) + .setColor(client.config.embed.color) + .setThumbnail(`https://eu.mc-api.net/v3/server/favicon/${ip}`) + .setFooter({ + text: client.config.embed.footer + }); + + interaction.editReply({ + embeds: [embed] + }); + } +} + +module.exports = Minecraft; \ No newline at end of file diff --git a/commands/General/remindme.js b/commands/General/remindme.js new file mode 100644 index 00000000..10ef342a --- /dev/null +++ b/commands/General/remindme.js @@ -0,0 +1,61 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + ms = require("ms"); + +class Remindme extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("remindme") + .setDescription(client.translate("general/remindme:DESCRIPTION")) + .addStringOption(option => option.setName("time") + .setDescription(client.translate("owner/remindme:TIME")) + .setRequired(true)) + .addStringOption(option => option.setName("message") + .setDescription(client.translate("common:MESSAGE")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction, data) { + const time = interaction.options.getString("time"); + const message = interaction.options.getString("message"); + const dateNow = Date.now(); + if (!data.userData.reminds) data.userData.reminds = []; + + const rData = { + message: message, + createdAt: dateNow, + sendAt: dateNow + ms(time) + }; + + data.userData.reminds.push(rData); + data.userData.markModified("reminds"); + data.userData.save(); + client.databaseCache.usersReminds.set(message.author.id, data.userData); + + interaction.success("general/remindme:SAVED"); + } +} + +module.exports = Remindme; \ No newline at end of file diff --git a/commands/General/report.js b/commands/General/report.js new file mode 100644 index 00000000..de679288 --- /dev/null +++ b/commands/General/report.js @@ -0,0 +1,99 @@ +const { SlashCommandBuilder, EmbedBuilder, parseEmoji } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Report extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("report") + .setDescription(client.translate("general/report:DESCRIPTION")) + .addUserOption(option => option.setName("user") + .setDescription(client.translate("common:USER")) + .setRequired(true)) + .addStringOption(option => option.setName("message") + .setDescription(client.translate("common:MESSAGE")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + if (interaction.user.id === "285109105717280768") return interaction.reply({ content: "Пошёл нахуй фахон" }); + const repChannel = interaction.guild.channels.cache.get(interaction.guild.data.plugins.reports); + if (!repChannel) return interaction.error("general/report:MISSING_CHANNEL"); + const member = interaction.options.getMember("user"); + if (member.id === interaction.user.id) return interaction.error("general/report:INVALID_USER"); + const rep = interaction.options.getString("message"); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("general/report:TITLE", { + user: member.user.tag + }), + iconURL: interaction.user.displayAvatarURL({ + extension: "png", + size: 512 + }) + }) + .addFields([ + { + name: interaction.translate("common:DATE"), + value: client.printDate(new Date(Date.now())) + }, + { + name: interaction.translate("common:AUTHOR"), + value: interaction.user.toString(), + inline: true + }, + { + name: interaction.translate("common:USER"), + value: member.user.toString(), + inline: true + }, + { + name: interaction.translate("common:REASON"), + value: rep, + inline: true + } + ]) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + const success = parseEmoji(client.customEmojis.cool).id; + const error = parseEmoji(client.customEmojis.notcool).id; + + repChannel.send({ + embeds: [embed] + }).then(async (m) => { + await m.react(success); + await m.react(error); + }); + + interaction.success("general/report:SUCCESS", { + channel: repChannel.toString() + }); + } +} + +module.exports = Report; \ No newline at end of file diff --git a/commands/General/serverinfo.js b/commands/General/serverinfo.js new file mode 100644 index 00000000..0997f62f --- /dev/null +++ b/commands/General/serverinfo.js @@ -0,0 +1,106 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Serverinfo extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("serverinfo") + .setDescription(client.translate("general/serverinfo:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const guild = interaction.guild; + + await guild.members.fetch(); + const owner = await guild.fetchOwner(); + + const embed = new EmbedBuilder() + .setAuthor({ + name: guild.name, + iconURL: guild.iconURL() + }) + .setThumbnail(guild.iconURL()) + .addFields([ + { + name: client.customEmojis.link + " " + interaction.translate("general/serverinfo:LINK"), + value: `[${interaction.translate("general/serverinfo:LINK_TEXT")}](${client.config.dashboard.baseURL}/stats/${guild.id})` + }, + { + name: client.customEmojis.title + interaction.translate("common:NAME"), + value: guild.name, + inline: true + }, + { + name: client.customEmojis.calendar + interaction.translate("common:CREATION"), + value: client.printDate(guild.createdAt), + inline: true + }, + { + name: client.customEmojis.users + interaction.translate("common:MEMBERS"), + value: `${guild.members.cache.filter(m => !m.user.bot).size} ${client.getNoun(guild.members.cache.filter(m => !m.user.bot).size, interaction.translate("misc:NOUNS:MEMBERS:1"), interaction.translate("misc:NOUNS:MEMBERS:2"), interaction.translate("misc:NOUNS:MEMBERS:5"))}` + + "\n" + `${guild.members.cache.filter(m => m.user.bot).size} ${client.getNoun(guild.members.cache.filter(m => m.user.bot).size, interaction.translate("misc:NOUNS:BOTS:1"), interaction.translate("misc:NOUNS:BOTS:2"), interaction.translate("misc:NOUNS:BOTS:5"))}`, + inline: true + }, + { + name: client.customEmojis.afk + interaction.translate("general/serverinfo:AFK_CHANNEL"), + value: guild.afkChannel?.toString() || interaction.translate("common:MISSING"), + inline: true + }, + { + name: client.customEmojis.id + interaction.translate("common:ID"), + value: guild.id, + inline: true + }, + { + name: client.customEmojis.crown + interaction.translate("common:OWNER"), + value: owner.toString(), + inline: true + }, + { + name: client.customEmojis.boost + interaction.translate("general/serverinfo:BOOSTS"), + value: guild.premiumSubscriptionCount?.toString() || "0", + inline: true + }, + { + name: client.customEmojis.channels + interaction.translate("common:CHANNELS"), + value: `${guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size} ${client.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_TEXT").size, interaction.translate("misc:NOUNS:TEXT:1"), interaction.translate("misc:NOUNS:TEXT:2"), interaction.translate("misc:NOUNS:TEXT:5"))}` + + "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size} ${client.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_VOICE").size, interaction.translate("misc:NOUNS:VOICE:1"), interaction.translate("misc:NOUNS:VOICE:2"), interaction.translate("misc:NOUNS:VOICE:5"))}` + + "\n" + `${guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size} ${client.getNoun(guild.channels.cache.filter(c => c.type === "GUILD_CATEGORY").size, interaction.translate("misc:NOUNS:CATEGORY:1"), interaction.translate("misc:NOUNS:CATEGORY:2"), interaction.translate("misc:NOUNS:CATEGORY:5"))}`, + inline: true + } + ]) + + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Serverinfo; \ No newline at end of file diff --git a/commands/General/shorturl.js b/commands/General/shorturl.js new file mode 100644 index 00000000..f27110a4 --- /dev/null +++ b/commands/General/shorturl.js @@ -0,0 +1,48 @@ +const { SlashCommandBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + fetch = require("node-fetch"); + +class Shorturl extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("shorturl") + .setDescription(client.translate("general/shorturl:DESCRIPTION")) + .addStringOption(option => option.setName("url") + .setDescription(client.translate("general/shorturl:URL")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const url = interaction.options.getString("url"); + const res = await fetch(`https://is.gd/create.php?format=simple&url=${encodeURI(url)}`).then(res => res.text()); + + interaction.reply({ + content: `<${res}>`, + ephemeral: true + }); + } +} + +module.exports = Shorturl; \ No newline at end of file diff --git a/commands/General/staff.js b/commands/General/staff.js new file mode 100644 index 00000000..1429ec11 --- /dev/null +++ b/commands/General/staff.js @@ -0,0 +1,64 @@ +const { SlashCommandBuilder, EmbedBuilder, PermissionsBitField } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Staff extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("staff") + .setDescription(client.translate("general/staff:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + await interaction.guild.members.fetch(); + const administrators = interaction.guild.members.cache.filter((m) => m.permissions.has(PermissionsBitField.Flags.Administrator) && !m.user.bot); + const moderators = interaction.guild.members.cache.filter((m) => !administrators.has(m.id) && m.permissions.has(PermissionsBitField.Flags.ManageMessages) && !m.user.bot); + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("general/staff:TITLE", { + guild: interaction.guild.name + }) + }) + .addFields([ + { + name: interaction.translate("general/staff:ADMINS"), + value: (administrators.size > 0 ? administrators.map((a) => `${a.presence ? client.customEmojis.status[a.presence.status] : client.customEmojis.status.offline} | <@${a.user.id}>`).join("\n") : interaction.translate("general/staff:NO_ADMINS")) + }, + { + name: interaction.translate("general/staff:MODS"), + value: (moderators.size > 0 ? moderators.map((m) => `${m.presence ? client.customEmojis.status[m.presence.status] : client.customEmojis.status.offline} | <@${m.user.id}>`).join("\n") : interaction.translate("general/staff:NO_MODS")) + } + ]) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Staff; \ No newline at end of file diff --git a/commands/General/stats.js b/commands/General/stats.js new file mode 100644 index 00000000..9aaab6a8 --- /dev/null +++ b/commands/General/stats.js @@ -0,0 +1,104 @@ + +const { SlashCommandBuilder, EmbedBuilder, PermissionsBitField, version } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Stats extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("stats") + .setDescription(client.translate("general/stats:DESCRIPTION")), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const hiddenGuild = await client.guilds.fetch("568120814776614924"); + const users = client.users.cache.size - hiddenGuild.memberCount; + const servers = client.guilds.cache.size - 1; + + const statsEmbed = new EmbedBuilder() + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }) + .setAuthor({ + name: interaction.translate("common:STATS") + }) + .setDescription(interaction.translate("general/stats:MADE")) + .addFields([ + { + name: client.customEmojis.stats + " " + interaction.translate("general/stats:COUNTS_TITLE"), + value: interaction.translate("general/stats:COUNTS_CONTENT", { + servers: servers, + users: users + }), + inline: true + }, + { + name: client.customEmojis.version + " " + interaction.translate("general/stats:VERSIONS_TITLE"), + value: `\`Discord.js: v${version}\`\n\`Nodejs: v${process.versions.node}\``, + inline: true + }, + { + name: client.customEmojis.ram + " " + interaction.translate("general/stats:RAM_TITLE"), + value: `\`${(process.memoryUsage().heapUsed / 1024 / 1024).toFixed(2)}MB\``, + inline: true + }, + { + name: client.customEmojis.status.online + " " + interaction.translate("general/stats:ONLINE_TITLE"), + value: interaction.translate("general/stats:ONLINE_CONTENT", { + time: client.convertTime(Date.now() + client.uptime, true, true) + }) + }, + { + name: client.customEmojis.voice + " " + interaction.translate("general/stats:MUSIC_TITLE"), + value: interaction.translate("general/stats:MUSIC_CONTENT", { + count: `${client.player.queues.size} ${client.getNoun(client.player.queues.size, interaction.translate("misc:NOUNS:SERVERS:1"), interaction.translate("misc:NOUNS:SERVERS:2"), interaction.translate("misc:NOUNS:SERVERS:5"))}` + }) + }, + { + name: interaction.translate("general/stats:CREDITS_TITLE"), + value: interaction.translate("general/stats:CREDITS_CONTENT", { + donators: ["**`Добрый Спецназ#8801`** - Тестер, генератор идей"].join("\n"), + translators: ["**`[ДАННЫЕ УДАЛЕНЫ]#4507`** - :flag_ua: (НЕ ОБНОВЛЕН!)"].join("\n") + }) + }, + { + name: client.customEmojis.link + " " + interaction.translate("general/stats:LINKS_TITLE"), + value: interaction.translate("misc:STATS_FOOTER", { + dashboardLink: client.config.dashboard.baseURL, + docsLink: `${client.config.dashboard.baseURL}/docs/`, + inviteLink: client.generateInvite({ scopes: ["bot", "applications.commands"], permissions: [ PermissionsBitField.Flags.Administrator ] }), + donateLink: "https://qiwi.com/n/JONNYBRO/", + owner: client.config.owner.id + }) + } + ]); + + interaction.reply({ + embeds: [statsEmbed] + }); + } +} + +module.exports = Stats; \ No newline at end of file diff --git a/commands/General/suggest.js b/commands/General/suggest.js new file mode 100644 index 00000000..a086af12 --- /dev/null +++ b/commands/General/suggest.js @@ -0,0 +1,88 @@ +const { SlashCommandBuilder, EmbedBuilder, parseEmoji } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Suggest extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("suggest") + .setDescription(client.translate("general/suggest:DESCRIPTION")) + .addStringOption(option => option.setName("message") + .setDescription(client.translate("common:MESSAGE")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + if (interaction.user.id === "285109105717280768") return interaction.reply({ content: "Пошёл нахуй фахон" }); + const suggChannel = interaction.guild.channels.cache.get(interaction.guild.data.plugins.suggestions); + if (!suggChannel) return interaction.error("general/suggest:MISSING_CHANNEL"); + const suggestion = interaction.options.getString("message"); + + const embed = new EmbedBuilder() + .setAuthor({ + name: interaction.translate("general/suggest:TITLE", { + user: interaction.user.tag + }), + iconURL: interaction.member.displayAvatarURL({ + size: 512 + }) + }) + .addFields([ + { + name: interaction.translate("common:DATE"), + value: client.printDate(new Date(Date.now())) + }, + { + name: interaction.translate("common:AUTHOR"), + value: interaction.user.toString(), + inline: true + }, + { + name: interaction.translate("common:CONTENT"), + value: suggestion, + inline: true + } + ]) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + const success = parseEmoji(client.customEmojis.cool).id; + const error = parseEmoji(client.customEmojis.notcool).id; + + suggChannel.send({ + embeds: [embed] + }).then(async (m) => { + await m.react(success); + await m.react(error); + }); + + interaction.success("general/suggest:SUCCESS", { + channel: suggChannel.toString() + }); + } +} + +module.exports = Suggest; \ No newline at end of file diff --git a/commands/General/userinfo.js b/commands/General/userinfo.js new file mode 100644 index 00000000..b75c9ca0 --- /dev/null +++ b/commands/General/userinfo.js @@ -0,0 +1,120 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"); + +class Userinfo extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("userinfo") + .setDescription(client.translate("general/userinfo:DESCRIPTION")) + .addUserOption(option => option.setName("user") + .setDescription(client.translate("common:USER"))), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + const member = interaction.options.getMember("user") || interaction.member; + const embed = new EmbedBuilder() + .setAuthor({ + name: `${member.user.tag} (${member.id})`, + iconURL: member.displayAvatarURL({ + size: 512 + }) + }) + .setThumbnail(member.displayAvatarURL({ + size: 512 + })) + .addFields([ + { + name: ":man: " + interaction.translate("common:USERNAME"), + value: member.user.tag, + inline: true + }, + { + name: client.customEmojis.pencil + " " + interaction.translate("common:NICKNAME"), + value: member.nickname || interaction.translate("general/userinfo:NO_NICKNAME"), + inline: true + }, + { + name: client.customEmojis.status[member.presence.status] + " " + interaction.translate("common:STATUS"), + value: interaction.translate(`common:STATUS_${member.presence.status.toUpperCase()}`), + inline: true + }, + { + name: client.customEmojis.bot + " " + interaction.translate("common:ROBOT"), + value: member.user.bot ? interaction.translate("common:YES") : interaction.translate("common:NO"), + inline: true + }, + { + name: client.customEmojis.calendar + " " + interaction.translate("common:CREATION"), + value: client.printDate(member.user.createdAt), + inline: true + }, + { + name: client.customEmojis.calendar2 + " " + interaction.translate("common:JOIN"), + value: client.printDate(member.joinedAt), + inline: true + }, + { + name: client.customEmojis.color + " " + interaction.translate("common:COLOR"), + value: member.displayHexColor, + inline: true + }, + { + name: client.customEmojis.roles + " " + interaction.translate("common:ROLES"), + value: (member.roles.size > 10 ? member.roles.cache.map((r) => r).slice(0, 10).join(", ") + " " + interaction.translate("general/userinfo:MORE_ROLES", { + count: member.roles.cache.size - 10 + }) : (member.roles.cache.size < 1) ? interaction.translate("general/userinfo:NO_ROLE") : member.roles.cache.map((r) => r).join(", ")), + inline: true + } + ]) + .setColor(client.config.embed.color) + .setFooter({ + text: client.config.embed.footer + }); + + if (member.presence.activities[0].name === "Custom Status") { + embed.addFields([ + { + name: client.customEmojis.games + " " + interaction.translate("common:ACTIVITY"), + value: member.presence.activities[0] ? `${interaction.translate("general/userinfo:CUSTOM")}\n${member.presence.activities[0].state || interaction.translate("common:NOT_DEFINED")}` : interaction.translate("general/userinfo:NO_ACTIVITY"), + inline: true + } + ]); + } else { + embed.addFields([ + { + name: client.customEmojis.games + " " + interaction.translate("common:ACTIVITY"), + value: member.presence.activities[0] ? `${member.presence.activities[0].name}\n${member.presence.activities[0].details}\n${member.presence.activities[0].state}` : interaction.translate("general/userinfo:NO_GAME"), + inline: true + } + ]); + } + + interaction.reply({ + embeds: [embed] + }); + } +} + +module.exports = Userinfo; \ No newline at end of file diff --git a/commands/General/whois.js b/commands/General/whois.js new file mode 100644 index 00000000..9cd006f5 --- /dev/null +++ b/commands/General/whois.js @@ -0,0 +1,73 @@ +const { SlashCommandBuilder, EmbedBuilder } = require("discord.js"); +const BaseCommand = require("../../base/BaseCommand"), + fetch = require("node-fetch"); + +class Whois extends BaseCommand { + /** + * + * @param {import("../base/JaBa")} client + */ + constructor(client) { + super({ + command: new SlashCommandBuilder() + .setName("whois") + .setDescription(client.translate("general/whois:DESCRIPTION")) + .addStringOption(option => option.setName("ip") + .setDescription(client.translate("common:IP")) + .setRequired(true)), + aliases: [], + dirname: __dirname, + guildOnly: true, + ownerOnly: false + }); + } + /** + * + * @param {import("../../base/JaBa")} client + */ + async onLoad() { + //... + } + /** + * + * @param {import("../../base/JaBa")} client + * @param {import("discord.js").ChatInputCommandInteraction} interaction + * @param {Array} data + */ + async execute(client, interaction) { + await interaction.deferReply(); + const ip = interaction.options.getString("ip"); + const whois = await fetch(`http://ip-api.com/json/${ip}?fields=status,message,continent,continentCode,country,countryCode,region,regionName,city,zip,timezone,currency,isp,org,as,mobile,proxy,hosting,query`).then(response => response.json()); + if (whois.status === "fail") return interaction.reply({ content: interaction.translate("general/whois:ERROR", { ip }) }); + const embed = new EmbedBuilder() + .setTitle(interaction.translate("general/whois:INFO_ABOUT", { + ip + })) + .setFooter({ + text: client.config.embed.footer + }) + .setColor(client.config.embed.color) + .addFields( + { name: interaction.translate("common:IP"), value: whois.query, inline: true }, + { name: interaction.translate("general/whois:COUNTRY"), value: `${whois.country || interaction.translate("common:UNKNOWN")} (${whois.countryCode || interaction.translate("common:UNKNOWN")})`, inline: true }, + { name: interaction.translate("general/whois:REGION"), value: `${whois.regionName || interaction.translate("common:UNKNOWN")} (${whois.region || interaction.translate("common:UNKNOWN")})`, inline: true }, + { name: interaction.translate("general/whois:CITY"), value: `${whois.city || interaction.translate("common:UNKNOWN")}`, inline: true }, + { name: interaction.translate("general/whois:ZIP"), value: `${whois.zip || interaction.translate("common:UNKNOWN")}`, inline: true }, + { name: interaction.translate("general/whois:TIMEZONE"), value: `${whois.timezone || interaction.translate("common:UNKNOWN")}`, inline: true }, + { name: interaction.translate("general/whois:CONTINENT"), value: `${whois.continent || interaction.translate("common:UNKNOWN")} (${whois.continentCode || interaction.translate("common:UNKNOWN")})`, inline: true }, + { name: interaction.translate("general/whois:CURRENCY"), value: `${whois.currency || interaction.translate("common:UNKNOWN")}`, inline: true }, + { name: interaction.translate("general/whois:ISP"), value: `${whois.isp || interaction.translate("common:UNKNOWN")}`, inline: true } + ) + .setTimestamp(); + + if (whois.proxy) embed.addFields({ name: interaction.translate("general/whois:INFO"), value: interaction.translate("general/whois:PROXY") }); + else if (whois.mobile) embed.addFields({ name: interaction.translate("general/whois:INFO"), value: interaction.translate("general/whois:MOBILE") }); + else if (whois.hosting) embed.addFields({ name: interaction.translate("general/whois:INFO"), value: interaction.translate("general/whois:HOSTING") }); + + interaction.editReply({ + embeds: [embed] + }); + } +} + +module.exports = Whois; \ No newline at end of file diff --git a/commands/Music/queue.js b/commands/Music/queue.js index d4691796..03036761 100644 --- a/commands/Music/queue.js +++ b/commands/Music/queue.js @@ -35,8 +35,8 @@ class Queue extends BaseCommand { if (!queue) return interaction.error("music/play:NOT_PLAYING"); const currentTrack = queue.current; - const tracks = queue.tracks.slice(0, 10).map((t, i) => { - return `${i}. [${t.title}](${t.url})\n> ${interaction.translate("music/queue:ADDED")} ${t.requestedBy}`; + const tracks = queue.tracks.slice(0, 10).map(track => { + return `${queue.tracks.indexOf(track)}. [${track.title}](${track.url})\n> ${interaction.translate("music/queue:ADDED")} ${track.requestedBy}`; }); const embed = new EmbedBuilder() diff --git a/commands/Owner/announcement.js b/commands/Owner/announcement.js index 31d46e45..bd5c3067 100644 --- a/commands/Owner/announcement.js +++ b/commands/Owner/announcement.js @@ -11,10 +11,9 @@ class Announcement extends BaseCommand { command: new SlashCommandBuilder() .setName("announcement") .setDescription(client.translate("owner/announcement:DESCRIPTION")) - .addStringOption(option => - option.setName("message") - .setDescription(client.translate("owner/say:MESSAGE")) - .setRequired(true)), + .addStringOption(option => option.setName("message") + .setDescription(client.translate("common:MESSAGE")) + .setRequired(true)), aliases: [], dirname: __dirname, guildOnly: true, diff --git a/commands/Owner/debug.js b/commands/Owner/debug.js index 5704340b..6f71c6f8 100644 --- a/commands/Owner/debug.js +++ b/commands/Owner/debug.js @@ -11,51 +11,43 @@ class Debug extends BaseCommand { command: new SlashCommandBuilder() .setName("debug") .setDescription(client.translate("owner/debug:DESCRIPTION")) - .addSubcommand(subcommand => - subcommand.setName("set") - .setDescription(client.translate("owner/debug:SET")) - .addStringOption(option => - option.setName("type") - .setDescription(client.translate("owner/debug:TYPE")) - .setRequired(true) - .addChoices( - { name: client.translate("common:LEVEL"), value: "level" }, - { name: client.translate("common:XP"), value: "xp" }, - { name: client.translate("common:CREDITS"), value: "credits" }, - { name: client.translate("economy/transactions:BANK"), value: "bank" }, - { name: client.translate("common:REP"), value: "rep" }, - )) - .addUserOption(option => - option.setName("target") - .setDescription(client.translate("owner/debug:TARGET")) - .setRequired(true)) - .addIntegerOption(option => - option.setName("int") - .setDescription(client.translate("owner/debug:INT")) - .setRequired(true)) + .addSubcommand(subcommand => subcommand.setName("set") + .setDescription(client.translate("owner/debug:SET")) + .addStringOption(option => option.setName("type") + .setDescription(client.translate("owner/debug:TYPE")) + .setRequired(true) + .addChoices( + { name: client.translate("common:LEVEL"), value: "level" }, + { name: client.translate("common:XP"), value: "xp" }, + { name: client.translate("common:CREDITS"), value: "credits" }, + { name: client.translate("economy/transactions:BANK"), value: "bank" }, + { name: client.translate("common:REP"), value: "rep" }, + )) + .addUserOption(option => option.setName("target") + .setDescription(client.translate("owner/debug:TARGET")) + .setRequired(true)) + .addIntegerOption(option => option.setName("int") + .setDescription(client.translate("owner/debug:INT")) + .setRequired(true)) ) - .addSubcommand(subcommand => - subcommand.setName("add") - .setDescription(client.translate("owner/debug:ADD")) - .addStringOption(option => - option.setName("type") - .setDescription(client.translate("owner/debug:TYPE")) - .setRequired(true) - .addChoices( - { name: client.translate("common:LEVEL"), value: "level" }, - { name: client.translate("common:XP"), value: "xp" }, - { name: client.translate("common:CREDITS"), value: "credits" }, - { name: client.translate("economy/transactions:BANK"), value: "bank" }, - { name: client.translate("common:REP"), value: "rep" }, - )) - .addUserOption(option => - option.setName("user") - .setDescription(client.translate("common:USER")) - .setRequired(true)) - .addIntegerOption(option => - option.setName("int") - .setDescription(client.translate("owner/debug:INT")) - .setRequired(true)) + .addSubcommand(subcommand => subcommand.setName("add") + .setDescription(client.translate("owner/debug:ADD")) + .addStringOption(option => option.setName("type") + .setDescription(client.translate("owner/debug:TYPE")) + .setRequired(true) + .addChoices( + { name: client.translate("common:LEVEL"), value: "level" }, + { name: client.translate("common:XP"), value: "xp" }, + { name: client.translate("common:CREDITS"), value: "credits" }, + { name: client.translate("economy/transactions:BANK"), value: "bank" }, + { name: client.translate("common:REP"), value: "rep" }, + )) + .addUserOption(option => option.setName("user") + .setDescription(client.translate("common:USER")) + .setRequired(true)) + .addIntegerOption(option => option.setName("int") + .setDescription(client.translate("owner/debug:INT")) + .setRequired(true)) ), aliases: [], dirname: __dirname, diff --git a/commands/Owner/eval.js b/commands/Owner/eval.js index fe76982e..505c187e 100644 --- a/commands/Owner/eval.js +++ b/commands/Owner/eval.js @@ -11,10 +11,9 @@ class Eval extends BaseCommand { command: new SlashCommandBuilder() .setName("eval") .setDescription(client.translate("owner/eval:DESCRIPTION")) - .addStringOption(option => - option.setName("code") - .setDescription(client.translate("owner/eval:CODE")) - .setRequired(true)), + .addStringOption(option => option.setName("code") + .setDescription(client.translate("owner/eval:CODE")) + .setRequired(true)), aliases: [], dirname: __dirname, guildOnly: true, diff --git a/commands/Owner/reload.js b/commands/Owner/reload.js index de1fe5e2..2f1fa425 100644 --- a/commands/Owner/reload.js +++ b/commands/Owner/reload.js @@ -13,10 +13,9 @@ class Reload extends BaseCommand { command: new SlashCommandBuilder() .setName("reload") .setDescription(client.translate("owner/reload:DESCRIPTION")) - .addStringOption(option => - option.setName("command") - .setDescription(client.translate("owner/reload:COMMAND")) - .setRequired(true)), + .addStringOption(option => option.setName("command") + .setDescription(client.translate("owner/reload:COMMAND")) + .setRequired(true)), aliases: [], dirname: __dirname, guildOnly: true, diff --git a/commands/Owner/say.js b/commands/Owner/say.js index b42a6f52..68ce38e5 100644 --- a/commands/Owner/say.js +++ b/commands/Owner/say.js @@ -11,13 +11,11 @@ class Say extends BaseCommand { command: new SlashCommandBuilder() .setName("say") .setDescription(client.translate("owner/say:DESCRIPTION")) - .addStringOption(option => - option.setName("message") - .setDescription(client.translate("owner/say:MESSAGE")) - .setRequired(true)) - .addChannelOption(option => - option.setName("channel") - .setDescription(client.translate("owner/say:CHANNEL"))), + .addStringOption(option => option.setName("message") + .setDescription(client.translate("common:MESSAGE")) + .setRequired(true)) + .addChannelOption(option => option.setName("channel") + .setDescription(client.translate("common:CHANNEL"))), aliases: [], dirname: __dirname, guildOnly: true, diff --git a/dashboard/views/manager/guild.ejs b/dashboard/views/manager/guild.ejs index a521ce3e..ed222210 100644 --- a/dashboard/views/manager/guild.ejs +++ b/dashboard/views/manager/guild.ejs @@ -98,17 +98,11 @@
- -
- - -