- GuildMusicState zbiera stan jednego serwera w jedną strukturę. Dotąd
było to dziewięć równoległych słowników indeksowanych guild_id
(queues, currents, volumes, loop_currents, loop_playlists, last_channels,
history, queue_indices, jump_flag), co wymagało pamiętania, że przy
każdej zmianie trzeba ruszyć kilka z nich naraz.
- LoopMode zastępuje parę booleanów loop_current/loop_playlist, których
kombinacja "oba włączone" nie miała sensu, a mimo to była osiągalna.
Wartości enuma (off/playlist/single) odpowiadają kontraktowi API panelu.
- TrackEmbedFactory zbiera budowanie osadzeń Discorda, powielone dotąd
w enqueue_track i play_next.
- NotificationChannelResolver opisuje kolejność szukania kanału logów:
zapamiętany -> z konfiguracji -> pierwszy zapisywalny na serwerze.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ytdl.py rozbity na cztery pliki o rozłącznych rolach:
- YtdlOptions opcje yt-dlp i FFmpeg, wcześniej moduły-globalne
- MediaProbe odczyt długości pliku przez ffprobe
- YTDLSource samo źródło audio - dane utworu i zliczanie odtworzonego
czasu; dochodzą właściwości is_local, filepath, display_url
i has_web_link, które zastępują powtarzane w kilku miejscach
data.get("webpage_url") or url
- TrackFactory budowanie źródeł z zapytania, adresu lub pliku
Rozdzielenie źródła od sposobu jego tworzenia usuwa globalną instancję
YoutubeDL i pozwala podmienić fabrykę w testach. Metoda recreate zbiera
w jednym miejscu odtwarzanie utworu od nowa z zachowaniem jego tożsamości
i pozostałej liczby odtworzeń.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Dostęp do danych trwałych schodzi za trzy repozytoria, zamiast być
rozsmarowany po metodach coga i endpointach:
- GuildConfigRepository - kanały powiadomień per serwer i domyślna liczba
odtworzeń.
- HistoryRepository - historia per serwer z buforem w pamięci i limitem
wpisów. Zasada odsiewania duplikatów (zgodny tytuł albo adres) siedzi
teraz w HistoryEntry.is_same_track_as zamiast w warunku wbudowanym
w listę składaną.
- UploadsRepository - katalog uploadów. Każda nazwa przechodzi przez
os.path.basename w jednym miejscu, co zamyka temat ścieżek względnych
przychodzących z API.
Wpisy historii i pliki opisują struktury HistoryEntry oraz UploadFileInfo
zamiast luźnych słowników z kluczami sprawdzanymi przez .get().
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Początek pakietu zyrarbot, budowanego wedle zasady jedna klasa = jeden plik.
- Settings zbiera konfigurację ze zmiennych środowiskowych oraz ścieżki
i limity, które dotąd były literałami rozsianymi po bot.py i web.py
("config/config.json", "uploads", zakres 1-999, domyślne 5 odtworzeń).
- JsonFileStore zastępuje sześć niemal identycznych bloków open/json.load
z ręcznym try/except. Brakujący lub uszkodzony plik daje pusty słownik
zamiast wyjątku, a zapis sam tworzy katalog.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>