Logo Karwińska Olimpiada

Karwińska Olimpiada

System turniejowy i centrum wydarzeń naszej społeczności - od corocznych igrzysk po spotkania planszówkowe z podziałem na tiery.

Next.jsTypeScriptPostgreSQLTailwind CSSDocker

Geneza & Cel

Problem i kontekst

Karwińska Olimpiada zaczynała się jako coroczny turniej ze znajomymi, ale szybko doszły do tego mniejsze zawody i regularne wieczory z planszówkami. Przez lata organizowaliśmy wszystko w arkuszach kalkulacyjnych i na grupach na Messengerze. W pewnym momencie chaos był już zbyt duży - gubiły się terminy, nikt nie pamiętał dawnych wyników, a zgranie terminów kilkunastu osób o zupełnie różnych grafikach graniczyło z cudem. Podzieliłem więc wydarzenia na tiery (od głównych igrzysk po luźne spotkania) i postanowiłem przenieść całą organizację do własnego systemu.

Główny cel

Chciałem zbudować jedno narzędzie webowe, które zdejmie ze mnie ręczne układanie drabinek i terminarzy. Każdy gracz po wejściu na stronę miał widzieć tylko swoje mecze, bez przedzierania się przez cały harmonogram imprezy. Zależało mi też na automatycznym zbieraniu dostępności terminów przed każdym wydarzeniem i aktualizowaniu wyników na żywo bez opóźnień.

Kluczowe funkcjonalności

Spersonalizowany harmonogram

Zamiast zmuszać graczy do szukania swojego nazwiska w wielkim arkuszu, przefiltrowałem widok pod zalogowanego użytkownika. Widzi on wyłącznie własne nadchodzące mecze, przypisany stół lub boisko oraz powiadomienia o ewentualnych opóźnieniach.

Zrzut ekranu modułu: Spersonalizowany harmonogram

Drabinki i tabele grupowe

Napisałem generator faz pucharowych i grupowych. Sędziowie wprowadzają wynik meczu bezpośrednio z telefonu, a system od razu przelicza bilans małych punktów, tabelę i pary kolejnej rundy.

Zrzut ekranu modułu: Drabinki i tabele grupowe

Ankiety i głosowania

Moduł ankiet, którego używaliśmy przede wszystkim do wyboru gier i dyscyplin na kolejne edycje turniejów. Poza wspólnym ustalaniem listy tytułów gracze mogli też głosować na MVP czy oceniać organizację pojedynczych konkurencji, a organizator decydował, które pola ankiety uczestnicy mogą edytować sami.

Zrzut ekranu modułu: Ankiety i głosowania

Ekosystem & Powiązane aplikacje

Dartes

Aplikacja tablicy wyników do darta (dart.kkol.pl), którą napisałem i wdrożyłem na sezon 2026 Karwińskiej Olimpiady. Liczy legi, podpowiada checkouty i bezpośrednio po zakończeniu pojedynku przesyła wynik do głównej tabeli turnieju na kkol.pl.

Subaplikacja ekosystemu: Dartes (dart.kkol.pl)

KKOL Bot

Bot Discordowy, który łączy nasz serwer ze stroną kkol.pl. Odpytuje kalendarz przez REST API z kluczem autoryzacyjnym, sam wrzuca na kanał ankiety z wyborem terminu planszówek i w każdy czwartek publikuje ciekawostki ze statystykami ustawione przeze mnie w panelu.

Interaktywna ankieta Discord dla KKOL Bot
Automatyczna czwartkowa ciekawostka ze statystykami dla KKOL Bot

Wyzwania inżynieryjne

Wielopoziomowy system uprawnień i delegowanie ról

Największym wyzwaniem było dla mnie ułożenie uprawnień tak, żebym nie musiał sam wprowadzać każdego wyniku. Wprowadziłem trzy role główne: Admin, Organizator i Gracz. Organizator danego turnieju może przekazać prawa do współedycji meczów innemu graczowi (np. sędziemu przy tarczy), ale bez prawa do kasowania imprezy. Wewnątrz ankiet organizator ustala osobne reguły - gracze mogą dopisywać pytania, ale nie mogą zmieniać etykiet. Żeby nie zablokować sobie dostępu, jako administrator mam nadrzędny bypass, który pozwala mi edytować dowolny element w systemie bez sprawdzania przypisania do turnieju.

Wielopoziomowy model uprawnień (RBAC) - schemat hierarchii i reguł kontekstowych

Wspólna autoryzacja i integracja z botem

Zamiast trzymać wszystko w jednym monolitycznym projekcie, wydzieliłem darta na subdomenę dart.kkol.pl, a powiadomienia powierzyłem botowi na Discordzie. Zrobiłem wspólne logowanie (SSO), dzięki czemu gracz loguje się do darta tym samym kontem co na kkol.pl. Bot Discorda komunikuje się z backendem kkol.pl przez zabezpieczone endpointy REST z kluczem API: sprawdza zbliżające się wydarzenia, publikuje ankiety i odznacza w bazie wysłane ciekawostki, żeby żadna wiadomość nie powtórzyła się dwa razy.

Topologia i przepływ danych w ekosystemie KKOL - centralny hub SSO, Dartes i Discord Bot