Commit Graph
43 Commits
Author SHA1 Message Date
lgooseandClaude Bot 1b424eaa7d fix(panel): healthcheck obrazu odpytuje 127.0.0.1 zamiast localhost
nginx nasłuchuje wyłącznie na IPv4, a w obrazie alpine localhost rozwiązuje
się najpierw na ::1. Healthcheck kończył się więc odmową połączenia i
kontener nigdy nie osiągał stanu healthy - wyszło to przy pisaniu CI,
gdzie ten sam sposób odpytania nie działał.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:34:55 +02:00
lgooseandClaude Bot 105f3e6c6a chore(frontend): ESLint dla Vue i TypeScriptu
Konfiguracja we flat configu: zalecane zestawy js, typescript-eslint oraz
eslint-plugin-vue. Bloki <script setup lang="ts"> obsługuje vue-eslint-parser
przekazujący zawartość do parsera TypeScriptu.

Odstępstwa od domyślnych reguł:

- vue/multi-word-component-names wyłączone - kafelki panelu mają nazwy
  własne i nie każda jest dwuczłonowa
- no-unused-vars przepuszcza nazwy z prefiksem podkreślenia
- no-console wyłączone dla testu dymnego, który raportuje wynik na stdout

Szablony przepuszczone przez eslint --fix, co ujednoliciło łamanie
atrybutów i domykanie znaczników. Po zmianach kontrola typów, build
i test dymny nadal przechodzą.

Dochodzą skrypty npm: lint (z --max-warnings 0) oraz lint:fix.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:34:55 +02:00
lgooseandClaude Bot 1b5ce2109b docs(frontend): opis panelu, struktury i uruchamiania
README opisuje pracę lokalną (npm run dev z proxy na backend), budowanie,
uruchomienie kontenera oraz strukturę katalogu src z rolą każdego pliku.
Spisane też zasady, które utrzymują panel spójnym: stan płynie z serwera,
zero innerHTML, ikony jako komponenty zamiast skryptu z CDN.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:09:02 +02:00
lgooseandClaude Bot 2feb963e6a test(frontend): test dymny zbudowanego panelu
Ładuje artefakt z dist/ w jsdom, podstawiając atrapy WebSocketu i fetcha,
a następnie sprawdza dwie rzeczy naraz:

- czy dane z serwera faktycznie renderują się w interfejsie (aktualny utwór,
  kolejka, historia, baza plików, głośność, tryb zapętlania, odmiana
  liczebników, formatowanie czasu)
- czy kliknięcia trafiają we właściwe endpointy - każdy przycisk sterujący
  porównywany jest z oczekiwaną parą metoda + ścieżka

Razem 31 sprawdzeń, uruchamiane przez npm run smoke po npm run build.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:09:02 +02:00
lgooseandClaude Bot bbd8a321f4 build: panel w osobnym kontenerze za nginxem
Rozdzielenie na dwie niezależne usługi:

- frontend/Dockerfile buduje panel w etapie node:22-alpine, a artefakt
  serwuje nginx:1.27-alpine. Obraz nie zawiera Node'a ani źródeł.
- frontend/nginx.conf serwuje aplikację jednostronicową (nieznane ścieżki
  wracają jako index.html), cache'uje /assets z sumą kontrolną w nazwie,
  a /api i /ws przekazuje do usługi discord-bot. Przeglądarka widzi jedno
  źródło, więc backend nie potrzebuje CORS-u.
  Adres backendu siedzi w zmiennej nginxa, więc nazwa jest rozwiązywana
  przy żądaniu i panel wstaje niezależnie od kolejności startu kontenerów.
- Proxy nie limituje rozmiaru ciała żądania i nie buforuje go, żeby
  wysyłka dużych plików wideo/audio przechodziła bez zmian w backendzie.
  Timeouty podniesione, bo panel trzyma WebSocket otwarty na stałe.
- Root Dockerfile wraca do samego Pythona i wystawia port 8000.
- compose.yaml uruchamia obie usługi we wspólnej sieci: panel na :80,
  API na :8000 (wystawione do diagnostyki).
- Katalog static/ znika z repozytorium - nie ma już czego serwować.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:08:50 +02:00
lgooseandClaude Bot 8d32d5afc6 feat(api): backend wystawia wyłącznie API i steruje botem
Panel działa w osobnym kontenerze, więc serwis Pythona przestaje serwować
pliki statyczne:

- usunięty mount StaticFiles na "/" wraz z importem
- tytuł aplikacji zmieniony na "ŻyrarBOT API"
- GET / zwraca opis usługi zamiast panelu, żeby wejście pod adres backendu
  nie kończyło się nic niemówiącym 404
- GET /api/health informuje, czy bot zdążył połączyć się z Discordem;
  przydaje się jako healthcheck kontenera i przy diagnozie proxy

Pozostałe endpointy oraz WebSocket pozostają bez zmian.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:08:50 +02:00
lgooseandClaude Bot d3408da2ed refactor: usunięcie starego panelu ze statycznych plików
static/app.js (1196 linii imperatywnego JS operującego na getElementById)
oraz static/index.html zastąpione w całości aplikacją z frontend/.
Arkusz stylów został wcześniej przeniesiony, nie usuwamy go ponownie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:08:31 +02:00
lgooseandClaude Bot 038fa2ead4 feat(frontend): komponenty panelu
Widok rozbity na komponenty odpowiadające kafelkom pulpitu:

- AppHeader, VoiceChannelPanel, PlayerPanel, AddTrackPanel
- UploadsPanel wraz z UploadedFileRow współdzielonym z oknem modalnym
- QueuePanel i QueueItem - przeciąganie, zmiana kolejności, limit odtworzeń
- HistoryPanel, ModalShell, SettingsModal, UploadsLibraryModal, ToastHost

Arkusz stylów przeniesiony ze static/style.css bez zmian w wyglądzie.
Style, które app.js wstrzykiwał inline przy budowaniu HTML-a, przeniesione
do klas współdzielonych i bloków scoped w komponentach.

Poprawki bezpieczeństwa wynikające z przepisania:

- Tytuły utworów i nazwy plików nie trafiają już do innerHTML. Poprzednia
  wersja składała wiersze kolejki, historii i listy plików ze stringów,
  więc tytuł zawierający znaczniki HTML był wstawiany do DOM bez escapowania.
- Nazwy plików nie są już wklejane do atrybutów onclick z ręcznym
  escapowaniem apostrofu, które i tak nie obejmowało cudzysłowu. Zdarzenia
  podpina Vue, bez generowania kodu w stringach.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:08:31 +02:00
lgooseandClaude Bot 119bff00a3 feat(frontend): composables ze stanem panelu
Logika, która w app.js żyła w zmiennych globalnych, trafia do czterech
composables o wyraźnym zakresie odpowiedzialności:

- useBotStatus     jedno połączenie WebSocket na aplikację, z licznikiem
                   subskrybentów i ponawianiem po zerwaniu. Flaga paused
                   wstrzymuje aktualizacje na czas przeciągania utworów.
- useToasts        kolejka powiadomień wraz z helperem run(), który
                   opakowuje wywołanie API w parę komunikatów sukces/błąd.
- useTrackProgress płynny pasek postępu - między pakietami z serwera czas
                   dopisujemy lokalnie, a każdy pakiet resynchronizuje licznik.
- useUploads       serwerowa baza plików, współdzielona przez kafelek na
                   pulpicie i okno z pełną listą.

Dochodzi też utils/plural.ts z polską odmianą liczebników, zamiast
powtarzanego w kilku miejscach warunku count < 5.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:08:04 +02:00
lgooseandClaude Bot 6bfa9b2a77 feat(frontend): kontrakt danych i typowany klient API
- types/status.ts spisuje kształt odpowiedzi /api/status oraz pakietów
  rozgłaszanych po WebSockecie. Dotąd struktura tych danych istniała
  wyłącznie w głowie autora i w rozsianych po kodzie odwołaniach.
- api/client.ts zbiera wszystkie adresy endpointów w jednym miejscu i
  ujednolica obsługę błędów: pole "detail" z odpowiedzi FastAPI trafia do
  wyjątku ApiError, więc warstwa widoku dostaje gotowy komunikat.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:08:04 +02:00
lgooseandClaude Bot ab3c980597 build(frontend): szkielet projektu Vue 3 + TypeScript + Vite
Panel przestaje być zestawem plików statycznych serwowanych przez backend
i staje się osobnym projektem w katalogu frontend/.

- Vue 3 z Composition API jako framework - szablony komponentów są bliskie
  dotychczasowemu HTML-owi, więc migracja nie wymaga przepisywania widoków
  na inny model mentalny.
- TypeScript w trybie strict; kontrakt danych z API będzie opisany typami.
- Vite jako bundler, z aliasem @ na src/ i budowaniem do dist/.
- Serwer deweloperski przekierowuje /api i /ws na backend; adres można
  nadpisać zmienną VITE_BACKEND_URL.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 01:07:47 +02:00
mmacierzanka edf317d21e feat: dodanie mechanizmu limitu odtworzeń (TTL) w kolejce oraz konfiguracji w UI i na Discordzie 2026-07-05 16:03:58 +02:00
mmacierzanka 5c98f29782 feat: ograniczenie widocznych plików do 10 ostatnio używanych, dodanie okna modalnego z całą bazą plików oraz zmiana ikony na plus przy przycisku Dodaj 3.0 2026-07-04 17:05:18 +02:00
mmacierzanka a900097134 feat: przebudowa systemu kolejki od podstaw z użyciem wskaźnika indeksu (nieusuwalna kolejka z możliwością przeskoku i przewijania) 2026-07-04 16:53:20 +02:00
mmacierzanka ab6f16b57d feat: połączenie przycisków zapętlania w jeden przycisk z cyklem Wyłączone -> Kolejka -> Utwór (styl YT Music/Spotify) 2026-07-04 16:41:17 +02:00
mmacierzanka 2a399364d8 feat: zmiana ikony play/pause w dashboardzie zależnie od stanu odtwarzania 2026-07-04 16:38:12 +02:00
mmacierzanka 55c9b7207f fix: wyświetlanie kanałów głosowych ze wszystkich serwerów na liście do połączenia w dashboardzie 2026-07-04 16:37:19 +02:00
mmacierzanka d05615a079 chore: dodanie katalogu uploads do .gitignore 2026-07-04 16:35:57 +02:00
mmacierzanka c0ec3a5f95 style: dodanie limitów szerokości kolumn i kontenerów zapobiegających rozjeżdżaniu się layoutu przy długich tytułach 2026-07-04 16:17:54 +02:00
mmacierzanka 8f0b398843 feat: deduplikacja wpisów w historii odtwarzania (każde nagranie widoczne tylko raz) 2026-07-04 16:14:40 +02:00
mmacierzanka 11a1834312 style: poprawa kontrastu i widoczności przycisku zamknięcia w panelu ustawień 2026-07-04 16:13:46 +02:00
mmacierzanka d074df571c fix: przywrócenie deklaracji voiceSelect w app.js rozwiązujące brak ładowania kanałów w interfejsie 2026-07-04 16:02:46 +02:00
mmacierzanka ebee5ac9d3 fix: dodanie brakującego importu Optional w bot.py oraz wyłączenie buforowania logów w Dockerze 2026-07-04 15:57:20 +02:00
mmacierzanka f2d19bd708 fix: dodanie python-multipart do requirements.txt dla obsługi przesyłania plików w FastAPI 2026-07-04 15:53:45 +02:00
mmacierzanka dcbd7859d7 refactor: przeniesienie konfiguracji kanału logów do dedykowanego modalu Ustawienia z wybierakiem per-serwer 2026-07-04 15:53:03 +02:00
mmacierzanka 89137f7d1c feat: dodanie trybu zapętlania całej kolejki (playlisty) w Discord (/loopplaylist) i w dashboardzie web 2026-07-04 15:39:32 +02:00
mmacierzanka 4f5ca391fa fix: naprawa działania pętli utworu - wyłączanie pętli pojedynczego utworu przy ręcznym pominięciu (/skip, przycisk w web) 2026-07-04 15:37:02 +02:00
mmacierzanka 65d797a1a6 feat: dodanie historii kolejki z możliwością ponownego odtwarzania w dashboardzie oraz komendy /history i /replay w Discord 2026-07-04 15:35:53 +02:00
mmacierzanka dfd681be04 feat: dodanie możliwości przesyłania własnych plików na serwer (wszystkie formaty ffmpeg), odtwarzanie jednym kliknięciem z web i komenda /playfile w Discord 2026-07-04 15:33:43 +02:00
mmacierzanka 444b797cd0 feat: sanityzacja tytułów w Discordzie oraz linki i embedy dla powiadomień z panelu web 2026-07-04 15:31:45 +02:00
mmacierzanka 867edf302f perf: usunięto redundantne zapytania HTTP statusu po kliknięciach przycisków, techniczne notyfikacje WS 2.0 2026-05-23 15:15:20 +02:00
mmacierzanka a8b2c89735 feat: zmigrowano panel webowy na WebSockets w czasie rzeczywistym 2026-05-23 15:10:19 +02:00
mmacierzanka 3eee27edfd feat: dodano pasek postępu odtwarzania w czasie rzeczywistym w panelu webowym 2026-05-23 15:04:42 +02:00
mmacierzanka c550215070 feat: add multi-guild support and text channel mapping persistence via Docker volume 2026-05-23 14:45:37 +02:00
mmacierzanka 07e32c1a1d chore: default volume to 100%, translate discord logs to Polish, rename project to ŻyrarBOT 2026-05-23 14:37:16 +02:00
mmacierzanka 71800c8fd5 feat: add beautiful web queue dashboard with loop, reordering, and text channel settings persistence 2026-05-23 14:32:43 +02:00
mmacierzanka 6382955b3f Remove yt-dlp version lock 1.0 2026-05-23 00:58:19 +02:00
mmacierzanka e24ca36ccb Remove redundant youtube_dl bug report suppression logic
Caused issues with playback
2025-06-14 02:13:21 +02:00
mmacierzanka bf724efe4d Update yt-dlp version in requirements.txt to 2025.6.9 2025-06-14 02:13:09 +02:00
mmacierzanka fcedb7e8c0 Pin yt-dlp version in requirements.txt to 2025.3.31 2025-06-01 00:30:58 +02:00
mmacierzanka cd0a738fdf Refactor bot to use Discord app commands and modernize structure
Replaced old commands-based approach with Discord app commands for slash command functionality. Simplified error handling, removed redundant code, and improved voice channel management. Updated bot's initialization and ensured proper command syncing for global or guild-specific contexts.
2025-04-28 03:56:57 +02:00
mmacierzanka 78cacc3a17 Add Docker and Compose setup for Discord bot deployment
Introduce Dockerfile for containerizing the Discord bot, including required dependencies for audio handling. Add compose.yaml for simplified service orchestration. Update .gitignore to exclude compiled files and environment-specific artifacts.
2025-04-27 02:09:29 +02:00
mmacierzanka 514df72a03 Initial commit
Add music bot with YouTube integration and basic commands

Implemented a Discord bot with commands for playing, pausing, skipping, and managing a music queue utilizing yt_dlp and FFmpeg. Includes opus library loading fallback logic and gitignore entry for environment files.
2025-04-27 01:22:13 +02:00