diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..95f23d6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,17 @@ +# Use an official Python runtime as a base image +FROM python:3.11-slim + +# Install build dependencies +RUN apt-get update -y && apt-get install -y gcc python3-dev + +# Set the working directory to /app +WORKDIR /app + +# Copy the current directory contents into the container at /app +COPY . /app + +# Install any needed packages specified in requirements.txt +RUN pip install --no-cache-dir -r requirements.txt + +# Run main.py when the container launches +CMD ["python", "-u", "main.py"] diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f9a2fd8 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,32 @@ +version: "3.8" + +services: + lavalink: + image: ghcr.io/lavalink-devs/lavalink:latest + container_name: lavalink + restart: unless-stopped + environment: + - _JAVA_OPTIONS=-Xmx1G + - SERVER_PORT=2333 + volumes: + - ./application.yml:/opt/Lavalink/application.yml + networks: + - local + ports: + - "2333:2333" + + vocard: + container_name: vocard + build: + dockerfile: ./Dockerfile + volumes: + - ./settings.json:/app/settings.json + depends_on: + lavalink: + condition: service_started + networks: + - local + +networks: + local: + name: local diff --git a/langs/RU.json b/langs/RU.json index b64b5ad..661f326 100644 --- a/langs/RU.json +++ b/langs/RU.json @@ -3,15 +3,15 @@ "enabled": "вкл", "disabled": "выкл", - "nodeReconnect": "Пожалуйста, попробуйте снова! После переподключения узла.", + "nodeReconnect": "Пожалуйста, попробуйте чуть позже!", "noChannel": "Нет голосового канала для подключения. Пожалуйста, укажите или присоединитесь к одному.", "alreadyConnected": "Уже подключен к голосовому каналу.", "noPermission": "Извините! У меня нет разрешения на подключение или разговор в вашем голосовом канале.", - "noPlaySource": "Невозможно найти рабочие источники!", + "noPlaySource": "Не получилось найти рабочие источники!", "noPlayer": "На этом сервере не найдено ни одного активного плеера.", "notVote": "Эта команда требует вашего голоса! Введите `/vote` для получения дополнительной информации.", "languageNotFound": "Языковой пакет не найден! Пожалуйста, выберите существующий языковой пакет.", - "changedLanguage": "Успешно изменен на языковой пакет `{0}`.", + "changedLanguage": "Язык успешно изменен на `{0}`.", "setPrefix": "Готово! Мой префикс на вашем сервере теперь `{0}`. Попробуйте запустить `{1}ping`, чтобы проверить его.", "setDJ": "Установить роль DJ {0}.", "setqueue": "Установить режим очереди на `{0}`.", @@ -31,7 +31,7 @@ "pingTitle1": "Информация о боте:", "pingTitle2": "Информация о плеере:", "pingfield1": "```ID Шарда: {0}/{1}\nЗадержка Шарда: {2:.3f}s {3}\nРегион: {4}```", - "pingfield2": "```Узел: {0} - {1:.3f}s\nИгроки: {2}\nРегион Голоса: {3}```", + "pingfield2": "```Сервис: {0} - {1:.3f}s\nИгроки: {2}\nРегион Голоса: {3}```", "karaoke": "Вы обновили уровень на **{0}**, моноуровень на **{1}**, фильтрующая полоса на **{2}** и ширина фильтра на **{3}**", "tremolo&vibrato": "Вы обновили значение эффекта tremolo на **{0}** и vibrato на **{1}**", "rotation": "Вы обновили значение эффекта rotation на **{0}**", @@ -52,8 +52,8 @@ "playlistNotFound": "Плейлист [`{0}`] не найден. Введите /playlist view, чтобы посмотреть все ваши плейлисты.", "playlistNotAccess": "Извините! У вас нет доступа к этому плейлисту!", "playlistNoTrack": "Извините! В плейлисте [`{0}`] нет треков.", - "playlistNotAllow": "Эта команда не разрешена для связанных и общих плейлистов.", - "playlistPlay": "Добавлен плейлист [`{0}`] с `{1}` песнями в очередь.", + "playlistNotAllow": "Эта команда не разрешена для общих плейлистов.", + "playlistPlay": "Добавлен плейлист [`{0}`] с `{1}` треками в очередь.", "playlistOverText": "Извините! Имя плейлиста не может превышать 10 символов.", "playlistSameName": "Извините! Это имя не может совпадать с вашим новым именем.", "playlistDeleteError": "Вы не можете удалить плейлист по умолчанию.", @@ -69,7 +69,7 @@ "playlistNotInvaildUrl": "Пожалуйста, введите действительную ссылку или публичную плейлист-ссылку на Spotify или YouTube.", "playlistCreated": "Вы создали плейлист `{0}`. Введите /playlist view для получения дополнительной информации.", "playlistRenamed": "Вы переименовали `{0}` в `{1}`.", - "playlistLimitTrack": "Вы достигли лимита! Вы можете добавить только `{0}` песен в свой плейлист.", + "playlistLimitTrack": "Вы достигли лимита! Вы можете добавить только `{0}` треков в свой плейлист.", "playlistPlaylistLink": "Вам не разрешено использовать ссылку на плейлист.", "playlistStream": "Вам не разрешено добавлять потоковые видео в свой плейлист.", "playlistPositionNotFound": "Не удается найти позицию `{0}` в вашем плейлисте [`{1}`]!", @@ -86,8 +86,8 @@ "invitationSent": "Приглашение отправлено {0}.", "notInChannel": "{0}, для использования голосовых команд вы должны находиться в {1}. Пожалуйста, перезайдите, если вы уже в голосе!", - "noTrackPlaying": "Сейчас нет играющих песен.", - "noTrackFound": "Песни с таким запросом не найдены! Пожалуйста, укажите действительную ссылку.", + "noTrackPlaying": "Сейчас нет играющих треков.", + "noTrackFound": "Треки с таким запросом не найдены! Пожалуйста, укажите действительную ссылку.", "noLinkSupport": "Команда поиска не поддерживает ссылки!", "voted": "Вы проголосовали!", "missingPerms_pos": "Только DJ или администраторы могут изменять позицию.", @@ -102,15 +102,15 @@ "playlistAddError": "Вам не разрешено добавлять потоковые видео в плейлист!", "playlistAddError2": "Произошла ошибка при добавлении треков в плейлист!", - "playlistlimited": "Вы достигли лимита! Вы можете добавить только {0} песни в свой плейлист.", + "playlistlimited": "Вы достигли лимита! Вы можете добавить только {0} треков в свой плейлист.", "playlistrepeated": "Такой же трек уже есть в вашем плейлисте!", "playlistAdded": "❤️ Добавлен **{0}** в плейлист пользователя {1} [`{2}`]!", - "playerDropdown": "Выберите песню для перехода ...", + "playerDropdown": "Выберите трек для перехода ...", "buttonBack": "Назад", - "buttonPause": "Приостановить", - "buttonResume": "Продолжить", + "buttonPause": "Пауза", + "buttonResume": "Пуск", "buttonSkip": "Вперед", "buttonLeave": "СТОП", "buttonLoop": "Зациклить", @@ -130,14 +130,14 @@ "connect": "Подключено к {0}", "live": "В ЭФИРЕ", - "playlistLoad": "🎶 Добавлен плейлист **{0}** с `{1}` песнями в очередь.", + "playlistLoad": "🎶 Добавлен плейлист **{0}** с `{1}` треками в очередь.", "trackLoad": "Добавлен **[{0}](<{1}>)** от **{2}** (`{3}`) для начала проигрывания.\n", "trackLoad_pos": "Добавлен **[{0}](<{1}>)** от **{2}** (`{3}`) в очередь на позицию **{4}**\n", "searchTitle": "Поиск: {0}", "searchDesc": "➥ Платформа: {0} **{1}**\n➥ Результаты: **{2}**\n\n{3}", - "searchWait": "Выберите песню, которую хотите добавить в очередь.", + "searchWait": "Выберите трек, который хотите добавить в очередь.", "searchTimeout": "Поиск прерван: превышено время ожидания. Пожалуйста, попробуйте позже.", - "searchSuccess": "Песня добавлен в очередь.", + "searchSuccess": "Трек добавлен в очередь.", "queueTitle": "Следующий в очереди:", "historyTitle": "История очереди:", @@ -146,39 +146,39 @@ "viewFooter": "Страница: {0}/{1} | Общая продолжительность: {2}", "pauseError": "Плеер уже на паузе.", - "pauseVote": "{0} проголосовал за паузу песни. [{1}/{2}]", - "paused": "`{0}` Поставил плеер на паузу.", + "pauseVote": "Пользователь `{0}` проголосовал за паузу трека. [{1}/{2}]", + "paused": "Пользователь `{0}` поставил плеер на паузу.", "resumeError": "Плеер не на паузе.", - "resumeVote": "{0} проголосовал за продолжение песни. [{1}/{2}]", - "resumed": "`{0}` Убрал плеер с паузы.", - "shuffleError": "Добавить больше песен в очередь перед перемешиванием.", - "shuffleVote": "{0} проголосовал за перемешивание очереди. [{1}/{2}]", + "resumeVote": "Пользователь `{0}` проголосовал за продолжение трека. [{1}/{2}]", + "resumed": "Пользователь `{0}` убрал плеер с паузы.", + "shuffleError": "Недостаточно треков для перемешивания", + "shuffleVote": "Пользователь `{0}` проголосовал за перемешивание очереди. [{1}/{2}]", "shuffled": "Очередь перемешана.", - "skipError": "Нет песен для пропуска.", - "skipVote": "{0} проголосовал за пропуск песни. [{1}/{2}]", - "skipped": "`{0}` пропустил песню.", + "skipError": "Нет треков для пропуска.", + "skipVote": "Пользователь `{0}` проголосовал за пропуск трека. [{1}/{2}]", + "skipped": "Пользователь `{0}` пропустил трек.", - "backVote": "{0} проголосовал за возврат к предыдущей песне. [{1}/{2}]", - "backed": "`{0}` вернулся к предыдущей песне.", + "backVote": "Пользователь `{0}` проголосовал за возврат к предыдущему треку. [{1}/{2}]", + "backed": "Пользователь `{0}` вернулся к предыдущему треку.", - "leaveVote": "{0} проголосовал за остановку плеера. [{1}/{2}]", + "leaveVote": "Пользователь `{0}` проголосовал за остановку плеера. [{1}/{2}]", "left": "`{0}` остановил плеер.", "seek": "Установить плеер на **{0}**", - "repeat": "Режим цикла установлен на `{0}`", + "repeat": "Режим повтора `{0}`", "cleared": "Очищены все треки в `{0}`", "removed": "Удалено `{0}` треков из очереди.", "forward": "Перемотать плеер вперед на **{0}**", - "rewind": "Перемотать плеер назад на **{0}**", - "replay": "Повторение текущей песни.", - "swapped": "Треки `{0}` и `{1}` обменяны местами", + "rewind": "Отмотать плеер назад на **{0}**", + "replay": "Повтор текущего трека.", + "swapped": "Треки `{0}` и `{1}` поменяны местами", "moved": "Трек `{0}` смещён на `{1}`", - "autoplay": "Режим autoplay установлен на **{0}**", + "autoplay": "Режим autoplay **{0}**", "notdj": "Вы не DJ. Текущий DJ: {0}.", "djToMe": "Вы не можете передать роль DJ себе или боту.", - "djnotinchannel": "`{0}` не находится в голосовом канале.", - "djswap": "Вы передали роль DJ `{0}`.", + "djnotinchannel": "Пользователь `{0}` не находится в голосовом канале.", + "djswap": "Вы передали роль DJ пользователю `{0}`.", "chaptersDropdown": "Выберите эпизод для перехода ...", "noChaptersFound": "Эпизод не найден!", @@ -189,4 +189,4 @@ "voicelinkDuplicateTrack": "Извините, этот трек уже есть в очереди.", "deocdeError": "Что-то пошло не так при декодировании файла!" -} \ No newline at end of file +} diff --git a/views/controller.py b/views/controller.py index f3ac08d..78a0cb5 100644 --- a/views/controller.py +++ b/views/controller.py @@ -343,7 +343,7 @@ class Forward(ControlButton): if not self.player.current: return await self.send(interaction, self.player.get_msg('noTrackPlaying'), ephemeral=True) - position = int(self.player.position + 30000) + position = int(self.player.position + 10000) await self.player.seek(position) await self.send(interaction, self.player.get_msg('forward').format(func.time(position))) @@ -465,4 +465,4 @@ class InteractiveController(discord.ui.View): elif isinstance(error, Exception): await interaction.response.send_message(error) - return \ No newline at end of file + return