diff --git a/README.md b/README.md index 743108e..fd7255b 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ Cool audiobot for Discord created by @Ale ## 🌟 Features - Command /alcotest which shows your alcohol count in blood -- Audioplayer based on [Distube](https://github.com/skick1234/DisTube) with buttons ![image](https://i.imgur.com/zqQ6ViY.png) +- Audioplayer based on [Distube](https://github.com/skick1234/DisTube) with buttons ![play-audioplayer](/wiki/images/commands/play-audioplayer.png) - Support YouTube, Spotify, Soundcloud, any HTTP-stream and Discord Attachments (/playfile support MP3/WAV/OGG) - Support Slash and Text commands (with customizable prefix per server using /setprefix) - Localization (English and Russian are currently supported) diff --git a/package.json b/package.json index dd0523d..dda26b6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aicbot", - "version": "3.0.0-dev-5", + "version": "3.0.0-dev-6", "description": "Discord Bot for playing music", "main": "build/main.js", "scripts": { diff --git a/src/commands/admin/setPrefix.command.ts b/src/commands/admin/setPrefix.command.ts index 3016f1f..4578798 100644 --- a/src/commands/admin/setPrefix.command.ts +++ b/src/commands/admin/setPrefix.command.ts @@ -9,7 +9,7 @@ export default function (): ICommand { text_data: { name: 'setprefix', description: i18next.t('commands:set_prefix_desc'), - arguments: [new CommandArgument('символ', true)], + arguments: [new CommandArgument('newprefix', true)], execute: async (message: Message, args: string[]): Promise => { const prefix: string = args[0]; if (!prefix) return; @@ -50,7 +50,7 @@ export default function (): ICommand { async function changePrefixTo(guild: Guild, prefix: string): Promise { if (prefix === '/' || prefix === '@' || prefix === '#') return i18next.t('commands:set_prefix_restrict_prefixes', { prefixes: '/ @ #' }) as string; - if (prefix.length > 1) return i18next.t('commands:set_prefix_length_error') as string; + if (prefix.length > 2) return i18next.t('commands:set_prefix_length_error') as string; await setGuildOption(guild, 'prefix', prefix); return i18next.t('commands:set_prefix_success_change', { prefix: prefix }) as string; } diff --git a/src/commands/audio/audiodebug.command.ts b/src/commands/audio/audiodebug.command.ts index 178938a..fcaa8be 100644 --- a/src/commands/audio/audiodebug.command.ts +++ b/src/commands/audio/audiodebug.command.ts @@ -1,6 +1,7 @@ import { ICommand } from '../../CommandTypes.js'; import { PermissionsBitField } from 'discord.js'; import { GroupAudio } from './AudioTypes.js'; +import { isOverpoweredUser } from '../../utilities/isOverpoweredUser.js'; export default function (): ICommand { return { @@ -8,6 +9,8 @@ export default function (): ICommand { name: 'audiodebug', description: 'Debug info about audioplayers', execute: async (message) => { + if (!isOverpoweredUser(message.author.id)) return; + await message.reply({ content: message.client.audioPlayer.playersManager.debug(), allowedMentions: { users: [] } diff --git a/src/commands/info/report.command.ts b/src/commands/info/report.command.ts index 858e725..ee33878 100644 --- a/src/commands/info/report.command.ts +++ b/src/commands/info/report.command.ts @@ -1,17 +1,13 @@ import { ICommand } from '../../CommandTypes.js'; import { - ActionRowBuilder, ChatInputCommandInteraction, Message, - ModalActionRowComponentBuilder, - ModalBuilder, PermissionsBitField, - SlashCommandBuilder, - TextInputBuilder, - TextInputStyle + SlashCommandBuilder } from 'discord.js'; import { GroupInfo } from './InfoTypes.js'; import i18next from 'i18next'; +import { generateSimpleEmbed } from '../../utilities/generateSimpleEmbed.js'; export default function (): ICommand { return { @@ -19,7 +15,7 @@ export default function (): ICommand { name: 'report', description: i18next.t('commands:report_desc'), execute: async (message: Message) => { - await message.reply(i18next.t('commands:report_text_error') as string); + await message.reply({ embeds: [generateReportEmbed()] }); } }, slash_data: { @@ -27,7 +23,7 @@ export default function (): ICommand { .setName('report') .setDescription(i18next.t('commands:report_desc')), execute: async (interaction: ChatInputCommandInteraction) => { - await interaction.showModal(generateModalWindow()); + await interaction.reply({ embeds: [generateReportEmbed()], ephemeral: true }); } }, group: GroupInfo, @@ -35,24 +31,12 @@ export default function (): ICommand { }; } -function generateModalWindow() { - const modal = new ModalBuilder() - .setCustomId('reportModal') - .setTitle(i18next.t('commands:report_modal_title')); - - const reportInput = new TextInputBuilder() - .setCustomId('reportInput') - .setLabel(i18next.t('commands:report_modal_text_label')) - .setStyle(TextInputStyle.Paragraph) - .setMinLength(20) - .setPlaceholder(i18next.t('commands:report_modal_text_placeholder')) - .setRequired(true); - - const firstActionRow = new ActionRowBuilder().addComponents( - reportInput +function generateReportEmbed() { + return generateSimpleEmbed( + i18next.t('commands:report_message', { + issueLink: 'https://github.com/AlexInCube/AlCoTest/issues/new/choose', + discussionLink: 'https://github.com/AlexInCube/AlCoTest/discussions/new?category=q-a', + interpolation: { escapeValue: false } + }) ); - - modal.addComponents(firstActionRow); - - return modal; } diff --git a/src/events/interactionCreate.event.ts b/src/events/interactionCreate.event.ts index 87cccd3..bc73dcb 100644 --- a/src/events/interactionCreate.event.ts +++ b/src/events/interactionCreate.event.ts @@ -1,7 +1,6 @@ import { BotEvent } from '../Types.js'; import { slashCommandHandler } from './interactionHandlers/slashCommandHandler.js'; import { autocompleteHandler } from './interactionHandlers/autocompleteHandler.js'; -import { modalsHandler } from './interactionHandlers/modalsHandler.js'; import { Client, Events, Interaction } from 'discord.js'; const event: BotEvent = { @@ -9,7 +8,6 @@ const event: BotEvent = { execute: async (client: Client, interaction: Interaction) => { await slashCommandHandler(interaction); await autocompleteHandler(interaction); - await modalsHandler(interaction); } }; diff --git a/src/events/interactionHandlers/modalsHandler.ts b/src/events/interactionHandlers/modalsHandler.ts deleted file mode 100644 index cb4a041..0000000 --- a/src/events/interactionHandlers/modalsHandler.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { submitReport } from '../../handlers/MongoSchemas/SchemaReport.js'; -import { Interaction } from 'discord.js'; -import i18next from 'i18next'; -import { ENV } from '../../EnvironmentVariables.js'; - -export async function modalsHandler(interaction: Interaction) { - if (!interaction.isModalSubmit()) return; - if (interaction.customId === 'reportModal') { - await interaction.reply({ - content: i18next.t('commands:report_modal_feedback') as string, - ephemeral: true - }); - - const reportInput = interaction.fields.getTextInputValue('reportInput'); - const overpoweredHuman = interaction.client.users.cache.get(ENV.BOT_DISCORD_OVERPOWERED_ID); - if (overpoweredHuman) { - await overpoweredHuman.send( - `New report from ${interaction.user.username} with ID: ${interaction.user.id}\n\n${reportInput}` - ); - } - await submitReport(interaction.user.id, reportInput); - } -} diff --git a/src/locales/en/commands.json b/src/locales/en/commands.json index c24db88..763f7f0 100644 --- a/src/locales/en/commands.json +++ b/src/locales/en/commands.json @@ -2,7 +2,7 @@ "set_prefix_desc": "Change prefix for TEXT commands and only for current server", "set_prefix_arg_newprefix_desc": "Don't forget to inform the other server members about the changed prefix", "set_prefix_restrict_prefixes": "You can't specify characters {{prefixes}} as a prefix", - "set_prefix_length_error": "The prefix cannot be longer than one character", + "set_prefix_length_error": "The prefix cannot be longer than two characters", "set_prefix_success_change": "Prefix successful changed on this server to {{prefix}}", "help_desc": "Commands list", "help_arg_command": "command name", @@ -56,12 +56,8 @@ "stop_success": "turned off the audioplayer", "alcotest_desc": "Writes the percentage of beer in your blood", "alcotest_success": "You are consisting of beer on the", - "report_desc": "Opens a modal window for sending a message to the developer", - "report_text_error": "Unfortunately, this command only works if it is called with /. So write /report", - "report_modal_title": "Creating a wish/complaint", - "report_modal_text_label": "What functionality to add or what to fix", - "report_modal_text_placeholder": "Describe clearly and precisely", - "report_modal_feedback": "Maybe I'll listen to you.", + "report_desc": "Return links to Github Issues or GitHub Discussions", + "report_message": "Create [Issue]({{issueLink}}) or [Discussion]({{discussionLink}})", "status_desc": "View bot status", "status_embed_title": "Bot status", "status_embed_bot_version": "Bot version", diff --git a/src/locales/ru/commands.json b/src/locales/ru/commands.json index b04bb00..7e64d87 100644 --- a/src/locales/ru/commands.json +++ b/src/locales/ru/commands.json @@ -2,7 +2,7 @@ "set_prefix_desc": "Меняет префикс для ТЕКСТОВЫХ команд и только для текущего сервера", "set_prefix_arg_newprefix_desc": "Не забудьте сообщить остальным участникам сервера об изменённом префиксе", "set_prefix_restrict_prefixes": "Нельзя указывать символы {{prefixes}} в качестве префикса", - "set_prefix_length_error": "Префикс не может быть длиннее одного символа", + "set_prefix_length_error": "Префикс не может быть длиннее двух символов", "set_prefix_success_change": "Префикс на этом сервере успешно изменён на {{prefix}}", "help_desc": "Список команд", "help_arg_command": "название команды", @@ -56,12 +56,8 @@ "stop_success": "выключил(-а) плеер", "alcotest_desc": "Пишет процент пива в твоей крови", "alcotest_success": "Вы состоите из пива на", - "report_desc": "Открывает окно для отправки сообщения разработчику", - "report_text_error": "К сожалению эта команда работает только если она вызвана через /. Так что напишите /report", - "report_modal_title": "Создание пожелания/жалобы", - "report_modal_text_label": "Какой функционал добавить или что исправить", - "report_modal_text_placeholder": "Описывайте ясно и чётко", - "report_modal_feedback": "Возможно я к тебе прислушаюсь", + "report_desc": "Возвращает ссылки на Github Issues или Github Discussions", + "report_message": "Создайте [Issue]({{issueLink}}) или [Discussion]({{discussionLink}})", "status_desc": "Просмотр состояния бота", "status_embed_title": "Состояние бота", "status_embed_bot_version": "Версия бота", diff --git a/src/utilities/isOverpoweredUser.ts b/src/utilities/isOverpoweredUser.ts new file mode 100644 index 0000000..72f35ee --- /dev/null +++ b/src/utilities/isOverpoweredUser.ts @@ -0,0 +1,5 @@ +import { ENV } from '../EnvironmentVariables.js'; + +export function isOverpoweredUser(userId: string): boolean { + return userId === ENV.BOT_DISCORD_OVERPOWERED_ID; +} diff --git a/wiki/API-Configure.md b/wiki/API-Configure.md index 001d281..4c13f4c 100644 --- a/wiki/API-Configure.md +++ b/wiki/API-Configure.md @@ -2,7 +2,7 @@ > Don't share this API data with anyone because you can get compromised. > If this happens, reset the tokens and get them again. -## Discord Developer Portal (required) +# Discord Developer Portal (required) 1. Open the [Discord Developer Portal](https://discord.com/developers/applications) and log into your account. 2. Click on the "New Application" button. @@ -10,7 +10,7 @@ You should see a page like this: -![discord-dev-selected-app](./images/discord-dev-selected-app.png) +![discord-dev-selected-app](images/api-configure/discord-dev-selected-app.png) You can edit your application's name, description, and avatar here. Once you've done that, then congratulations—you're now the proud owner of a shiny new Discord bot! You're not entirely done, though. @@ -19,9 +19,9 @@ You can edit your application's name, description, and avatar here. Once you've 6. Press "Reset token" button and copy token. 7. Also enable all "Privileged Gateway Intents" -![discord-dev-enable-intents](./images/discord-dev-enable-intents.png) +![discord-dev-enable-intents](images/api-configure/discord-dev-enable-intents.png) -## YouTube Cookie (optional) +# YouTube Cookie (optional) Preferable to provide cookies for YouTube. This will allow you to play 18+ videos and bypass YouTube rate limiting error (429 Error). I highly recommend that you create a new Google account from which you can get the cookie. @@ -37,38 +37,38 @@ I highly recommend that you create a new Google account from which you can get t 4. Click on the extension icon and click "Export" button. 5. Create file yt-cookies.json and paste cookie in this file -## Yandex Music (optional) +# Yandex Music (optional) If you do not provide token and UID, Yandex Music will not work at all. > [!WARNING] > If your bot is outside Russia VDS, you must have a Yandex Plus subscription to play songs. -### Token +## Token 1. Login into [Yandex](https://passport.yandex.ru/auth) account. 2. Download [browser extension](https://chromewebstore.google.com/detail/yandex-music-token/lcbjeookjibfhjjopieifgjnhlegmkib) -This must look like this ![yandex-extension](./images/yandex-music-extension.png) +This must look like this ![yandex-extension](images/api-configure/yandex-music-extension.png) 3. Click "Скопировать токен" button. -### UID +## UID 1. Login into [Yandex](https://passport.yandex.ru/auth) account. 2. You can retrieve uid by opening [Yandex Mail](https://mail.yandex.ru) and copy uid from the url in the address bar. -![yandex-uid](./images/yandex-music-uid.png) +![yandex-uid](images/api-configure/yandex-music-uid.png) -## Spotify (optional) +# Spotify (optional) Spotify Module can work without provided data, but for more stability better provide custom application data. > [!WARNING] > If you want to fetch playlist with more than 100 songs, this API data is required! 1. Login in [Spotify Developer Dashboard](https://developer.spotify.com/dashboard) -2. Press "Create app" button![Spotify Dev Main](images/spotify-dev-main.png) -3. Fill the fields like this![Spotify Dev Create App](./images/spotify-dev-create-app.png) +2. Press "Create app" button![Spotify Dev Main](images/api-configure/spotify-dev-main.png) +3. Fill the fields like this![Spotify Dev Create App](images/api-configure/spotify-dev-create-app.png) 4. Press "Save" 5. On the redirected page, press "Settings" 6. On "Basic Information" section copy Client ID. 7. Under the Client ID field, press "View Client Secret" and copy Client Secret. -## Soundcloud (optional) +# Soundcloud (optional) 1. Go to [SoundCloud](https://soundcloud.com) and login. 2. Open up the dev tools (Right-click -> inspect) and go to the Network tab. diff --git a/wiki/Commands.md b/wiki/Commands.md index e69de29..574ddd8 100644 --- a/wiki/Commands.md +++ b/wiki/Commands.md @@ -0,0 +1,129 @@ +# About command system +Bot supports slash and text command systems. + +## Slash commands +Nothing special, start writing / and select command from the list + +## Text commands +If a bot owner does not change the default prefix in .env.production file, the prefix is // + +> [!NOTE] +> If bot prefix conflicting with another bot on server, +> administrator can set the second text prefix for server using [/setPrefix](#setprefix) command + +# Commands list +## Admin +It Can be used only by server administrators (people who have a role with "Administrator" permission) + +### setPrefix +Changes bot prefix for the server + +Example: /newPrefix $$ + +Prefix symbols cannot be symbols: / @ #, because these symbols reserved for Discord purpose. +Prefix length cannot be longer than two symbols. + +## Audio + +The bot philosophy built around audioplayer to reduce commands using. + +Use [/play](#play) or [/playfile](#playfile) to spawn audioplayer +![play-audioplayer](images/commands/play-audioplayer.png) + +Most of the time of using bot, you need only add songs by [/play](#play) or [/playfile](#playfile) + +When any message created in chat where audioplayer is spawned, +bot will recreate the player so that the player is always at the bottom of the chat room. + +> [!NOTE] +> Highly recommended to create a text channel for the bot + +> [!WARNING] +> Audio commands which change audioplayer state require audioplayer and be with bot in the same voice channel to exist. +> Also this kind of commands needs to be written in the same channel where audioplayer was spawned. + +### play + +Example: /play https://open.spotify.com/track/46gSk82duJtX3TTA182ruG?si=c668ab77755f4d88 + +Spawn audioplayer in a text channel if not exists. +Accept songs/playlist from links. +Support searching on YouTube +when you write something like this ![play-autocomplete](images/commands/play-autocomplete.png) + +### playfile + +Do the same things as play command, but accept MP3/WAV/OGG files instead of text/links + +![play-file](images/commands/play-file.png) + +### playing + +Return the current playback time of the song +![playing](images/commands/playing.png) + +### download + +Accept links you songs and return mp3 file in a text channel where the command is called. + +Example: /download https://www.youtube.com/watch?v=60ItHLz5WEA + +### jump + +If your queue has a large count of songs, you can jump to the desired song. +To get the number of songs you want, press the button in audioplayer to get a queue songs list. + +Example: /jump 4 + +### previous + +Returns to previous played/skipped song in queue + +### rewind + +Allow you to change the current playback time. +Accept time in HH:MM:SS or MM:SS or SS format. + +Example: 1:02:32 + +### shuffle + +Shuffle the next songs in the queue + +### skip + +Skip current playing song + +### stop + +Kill the audioplayer + +### audiodebug + +Give the current count of spawned audioplayers + +> [!NOTE] +> This command supported only by text command system +> Also you must be overpowered user. + +## Fun + +### alcotest +Generate random number for 0 to 100 + +## Info + +### help +Return the command list or certain command description + +Command list example: /help +Certain command example: /help play + +### inviteLink +Return the link for inviting the bot. Give the link to the administrator on another server. + +### status +Return bot status data, about: OS, Ram Usage, Cpu Model, Cpu Usage, AICoTest Version, Servers Count. + +### report +Return links to GitHub Issues or GitHub Discussions. diff --git a/wiki/Setup.md b/wiki/Setup.md index 9937cea..351960c 100644 --- a/wiki/Setup.md +++ b/wiki/Setup.md @@ -1,34 +1,36 @@ -## ⚙️ Configure .env +# ⚙️ Configure .env + You can use Docker Compose or install all dependencies and source code locally. -But in both cases, you need to configure .env file. +But in both cases, you need to configure .env file. Also you need retrieve token, client id and enable intents on Discord Developer Portal. - Create file .env.production - Fill all fields in .env.production. If the field is marked as (Optional), you can skip it. -- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#discord-developer-portal-required) section. +- (Required) To get Discord Token and enable intents, follow the [Discord Developer Portal](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#discord-developer-portal-required) section. - (Optional) To get Spotify Secret and ID, follow the [Spotify](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#spotify-optional) section. - (Optional) To get Yandex Music token, follow the [Yandex Music](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#yandex-music-optional) section. - (Optional) To get SoundCloud token, follow the [Soundcloud](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#soundcloud-optional) section. -| Name | Example | Description | Required? | -|------------------------------|-----------------------|-------------------------------------------------------------------------|-----------| -| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | -| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | -| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | -| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | -| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | -| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | -| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Application ID from Discord Developer Portal | ✔️ | -| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | This need to retrieve reports in direct message | ✔️ | -| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | -| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | -| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | -| `BOT_YANDEXMUSIC_UID` | | Provide to enable Yandex Music module | ❌ | -| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | -| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | - -## 🐋 Run in Docker (recommended) +| Name | Example | Description | Required? | +|------------------------------|-----------------------|---------------------------------------------------------------------------|-----------| +| `BOT_VERBOSE_LOGGING` | false | The bot will give more information to the console, useful for debugging | ❌ | +| `BOT_COMMAND_PREFIX` | // | Used only for text commands | ✔️ | +| `BOT_LANGUAGE` | en | Supported values: en ru | ❌ | +| `MONGO_URI` | mongodb://mongo:27017 | The public key for sending notifications | ✔️ | +| `MONGO_DATABASE_NAME` | aicbot | Database name in MongoDB | ✔️ | +| `BOT_DISCORD_TOKEN` | ODEzNzUwMTY1N... | Token from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_CLIENT_ID` | 813750165783... | Application ID from Discord Developer Portal | ✔️ | +| `BOT_DISCORD_OVERPOWERED_ID` | 29016845994426.... | Discord bot owner user ID, required for having more bot control for owner | ✔️ | +| `BOT_SPOTIFY_CLIENT_SECRET` | | Used when the Spotify module cannot get the credentials automatically | ❌ | +| `BOT_SPOTIFY_CLIENT_ID` | | Used when the Spotify module get the credentials automatically | ❌ | +| `BOT_YANDEXMUSIC_TOKEN` | | Provide to enable Yandex Music module | ❌ | +| `BOT_YANDEXMUSIC_UID` | | Provide to enable Yandex Music module | ❌ | +| `BOT_SOUNDCLOUD_CLIENT_ID` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | +| `BOT_SOUNDCLOUD_TOKEN` | | Provide to fetch more data with SoundCloud Go+ account | ❌ | + +# 🐋 Run in Docker (recommended) + > [!NOTE] > Using Docker provides the auto-update feature @@ -37,15 +39,18 @@ Also you need retrieve token, client id and enable intents on Discord Developer - Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with docker-compose.yml etc. - (Optional) Follow the [YouTube Cookie](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#-youtube-cookie-optional) section and copy yt-cookies.json in the folder with docker-compose.yml etc. - Your file structure must be like this + ``` AICoTest/ ├─ .env.production ├─ docker-compose.yml ├─ yt-cookies.yml ``` -- Run command ```docker-compose up --detach --force-recreate``` from folder with files -## 🖥️ Run locally (if you are not a developer, this way is no sense) +- Run command `docker-compose up --detach --force-recreate` from folder with files + +# 🖥️ Run locally (if you are not a developer, this way is no sense) + - Install [Node.js 22](https://nodejs.org/en/download/prebuilt-installer) or higher - Install [Python 3.12](https://www.python.org/downloads/) - Install C++ compiler. Follow this [guide](https://github.com/nodejs/node-gyp#on-windows) @@ -54,15 +59,19 @@ AICoTest/ - Follow the [Configure .env](#-configure-env) section and copy .env.production in folder with repository. - (Optional) Follow the [YouTube Cookie](https://github.com/AlexInCube/AlCoTest/wiki/API-Configure#-youtube-cookie-optional) and copy yt-cookies.json in the folder with repository. - Install Node.js packages in the folder with repository + ```npm npm install ``` + - Compile bot + ``` npm run build ``` + - Run the bot + ``` npm run production ``` - diff --git a/wiki/images/discord-dev-enable-intents.png b/wiki/images/api-configure/discord-dev-enable-intents.png similarity index 100% rename from wiki/images/discord-dev-enable-intents.png rename to wiki/images/api-configure/discord-dev-enable-intents.png diff --git a/wiki/images/discord-dev-selected-app.png b/wiki/images/api-configure/discord-dev-selected-app.png similarity index 100% rename from wiki/images/discord-dev-selected-app.png rename to wiki/images/api-configure/discord-dev-selected-app.png diff --git a/wiki/images/spotify-dev-create-app.png b/wiki/images/api-configure/spotify-dev-create-app.png similarity index 100% rename from wiki/images/spotify-dev-create-app.png rename to wiki/images/api-configure/spotify-dev-create-app.png diff --git a/wiki/images/spotify-dev-main.png b/wiki/images/api-configure/spotify-dev-main.png similarity index 100% rename from wiki/images/spotify-dev-main.png rename to wiki/images/api-configure/spotify-dev-main.png diff --git a/wiki/images/yandex-music-extension.png b/wiki/images/api-configure/yandex-music-extension.png similarity index 100% rename from wiki/images/yandex-music-extension.png rename to wiki/images/api-configure/yandex-music-extension.png diff --git a/wiki/images/yandex-music-uid.png b/wiki/images/api-configure/yandex-music-uid.png similarity index 100% rename from wiki/images/yandex-music-uid.png rename to wiki/images/api-configure/yandex-music-uid.png diff --git a/wiki/images/commands/play-audioplayer.png b/wiki/images/commands/play-audioplayer.png new file mode 100644 index 0000000..ad93649 Binary files /dev/null and b/wiki/images/commands/play-audioplayer.png differ diff --git a/wiki/images/commands/play-autocomplete.png b/wiki/images/commands/play-autocomplete.png new file mode 100644 index 0000000..a5d9d84 Binary files /dev/null and b/wiki/images/commands/play-autocomplete.png differ diff --git a/wiki/images/commands/play-file.png b/wiki/images/commands/play-file.png new file mode 100644 index 0000000..aff3396 Binary files /dev/null and b/wiki/images/commands/play-file.png differ diff --git a/wiki/images/commands/playing.png b/wiki/images/commands/playing.png new file mode 100644 index 0000000..ffebf5c Binary files /dev/null and b/wiki/images/commands/playing.png differ