lgooseandClaude Bot 2a961e1a8a chore: konfiguracja ruff i poprawki wskazane przez lintera
Ruff jako linter i formatter, konfiguracja w pyproject.toml:

- reguły E, W, F, I, N, UP, B, C4, SIM, TID, BLE, RUF
- extend-immutable-calls dla fastapi.Depends, File i Query - wstrzykiwanie
  zależności opiera się na wywołaniach w wartościach domyślnych argumentów,
  więc bugbear B008 zgłaszał tam 66 fałszywych trafień
- zakaz importów względnych, aby ścieżki w pakiecie czytało się jednoznacznie
- katalog frontend wyłączony z analizy

Poprawki, które wskazał linter:

- Awaitable, Callable i AsyncIterator importowane z collections.abc zamiast
  z typing
- zbędny argument trybu w open(path, "r")
- contextlib.suppress zamiast try/except/pass przy anulowaniu zadania
- zdjęte dwie niepotrzebne dyrektywy noqa
- pięć linii przekraczających 100 znaków zawiniętych

Całość przepuszczona przez ruff format. Do .gitignore dochodzi .ruff_cache/.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:25:40 +02:00

ŻyrarBOT

Bot muzyczny Discord z panelem webowym: kolejka odtwarzania, historia, serwerowa baza plików i sterowanie na żywo przez WebSocket.

Uruchomienie

pip install -r requirements.txt
python main.py          # albo: python -m zyrarbot

Wymagane zmienne środowiskowe (plik .env):

Zmienna Opis
DISCORD_TOKEN Token bota Discord.
GUILD_ID Opcjonalnie - synchronizuje komendy tylko z jednym serwerem.

Panel działa pod http://localhost:8000. W Dockerze: docker compose up --build.

Testy

python -m unittest discover -s tests -t .

Struktura pakietu

Każda klasa mieszka w osobnym pliku, a pliki są pogrupowane w przestrzenie nazw odpowiadające warstwom aplikacji:

zyrarbot/
├── settings.py        Settings - konfiguracja ze zmiennych środowiskowych
├── application.py     Application - korzeń kompozycji, spina bota i serwer web
├── storage/           Warstwa trwałości (pliki JSON, katalog uploadów)
│   ├── json_file_store.py          JsonFileStore
│   ├── guild_config_repository.py  GuildConfigRepository
│   ├── history_repository.py       HistoryRepository
│   ├── uploads_repository.py       UploadsRepository
│   └── upload_file_info.py         UploadFileInfo
├── audio/             Pozyskiwanie dźwięku
│   ├── ytdl_options.py   YtdlOptions
│   ├── ytdl_source.py    YTDLSource
│   ├── media_probe.py    MediaProbe
│   └── track_factory.py  TrackFactory
├── music/             Domena odtwarzania
│   ├── loop_mode.py                    LoopMode
│   ├── history_entry.py                HistoryEntry
│   ├── guild_music_state.py            GuildMusicState
│   ├── track_embed_factory.py          TrackEmbedFactory
│   ├── notification_channel_resolver.py NotificationChannelResolver
│   └── music_player.py                 MusicPlayer
├── bot/               Warstwa Discorda
│   ├── client.py          ZyrarBot
│   ├── guild_resolver.py  GuildResolver
│   └── cogs/music_cog.py  MusicCog
└── web/               Panel webowy (FastAPI)
    ├── factory.py             create_app
    ├── connection_manager.py  ConnectionManager
    ├── status_service.py      StatusService
    ├── status_broadcaster.py  StatusBroadcaster
    ├── dependencies.py        wstrzykiwanie zależności z app.state
    ├── schemas/               modele żądań - jeden na plik
    └── routers/               trasy pogrupowane tematycznie

Zasady

  • MusicPlayer jest jedynym właścicielem stanu odtwarzania. Zarówno komendy Discorda, jak i endpointy panelu operują wyłącznie przez niego - nie ma już dwóch niezależnych ścieżek modyfikujących kolejkę.
  • Kolejka jest nieusuwalna, pozycję śledzi indeks (GuildMusicState.index), dzięki czemu działa przeskakiwanie i przewijanie w tył.
  • Zależności wędrują przez konstruktory, a w warstwie web przez app.state i funkcje z web/dependencies.py. Nie ma globalnych singletonów.
S
Description
Discord music bot utilizing yt-dlp with web dashboard
Readme
3 MiB
0 Stars 2 Watchers 0 Forks
ŻyrarBOT 5.0
Latest
2026-09-13 17:34:19 +02:00
Languages
Python 68.5%
Vue 16%
CSS 8.1%
TypeScript 4.5%
JavaScript 2.4%
Other 0.5%